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

Side by Side Diff: src/x87/macro-assembler-x87.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 | « src/x64/macro-assembler-x64.cc ('k') | no next file » | 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 "src/v8.h" 5 #include "src/v8.h"
6 6
7 #if V8_TARGET_ARCH_X87 7 #if V8_TARGET_ARCH_X87
8 8
9 #include "src/bootstrapper.h" 9 #include "src/bootstrapper.h"
10 #include "src/codegen.h" 10 #include "src/codegen.h"
(...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after
421 ASSERT(!value.is(address)); 421 ASSERT(!value.is(address));
422 AssertNotSmi(object); 422 AssertNotSmi(object);
423 423
424 if (!FLAG_incremental_marking) { 424 if (!FLAG_incremental_marking) {
425 return; 425 return;
426 } 426 }
427 427
428 // Compute the address. 428 // Compute the address.
429 lea(address, FieldOperand(object, HeapObject::kMapOffset)); 429 lea(address, FieldOperand(object, HeapObject::kMapOffset));
430 430
431 // Count number of write barriers in generated code.
432 isolate()->counters()->write_barriers_static()->Increment();
433 IncrementCounter(isolate()->counters()->write_barriers_dynamic(), 1);
434
435 // A single check of the map's pages interesting flag suffices, since it is 431 // A single check of the map's pages interesting flag suffices, since it is
436 // only set during incremental collection, and then it's also guaranteed that 432 // only set during incremental collection, and then it's also guaranteed that
437 // the from object's page's interesting flag is also set. This optimization 433 // the from object's page's interesting flag is also set. This optimization
438 // relies on the fact that maps can never be in new space. 434 // relies on the fact that maps can never be in new space.
439 ASSERT(!isolate()->heap()->InNewSpace(*map)); 435 ASSERT(!isolate()->heap()->InNewSpace(*map));
440 CheckPageFlagForMap(map, 436 CheckPageFlagForMap(map,
441 MemoryChunk::kPointersToHereAreInterestingMask, 437 MemoryChunk::kPointersToHereAreInterestingMask,
442 zero, 438 zero,
443 &done, 439 &done,
444 Label::kNear); 440 Label::kNear);
445 441
446 RecordWriteStub stub(isolate(), object, value, address, OMIT_REMEMBERED_SET); 442 RecordWriteStub stub(isolate(), object, value, address, OMIT_REMEMBERED_SET);
447 CallStub(&stub); 443 CallStub(&stub);
448 444
449 bind(&done); 445 bind(&done);
450 446
447 // Count number of write barriers in generated code.
448 isolate()->counters()->write_barriers_static()->Increment();
449 IncrementCounter(isolate()->counters()->write_barriers_dynamic(), 1);
450
451 // Clobber clobbered input registers when running with the debug-code flag 451 // Clobber clobbered input registers when running with the debug-code flag
452 // turned on to provoke errors. 452 // turned on to provoke errors.
453 if (emit_debug_code()) { 453 if (emit_debug_code()) {
454 mov(value, Immediate(BitCast<int32_t>(kZapValue))); 454 mov(value, Immediate(BitCast<int32_t>(kZapValue)));
455 mov(scratch1, Immediate(BitCast<int32_t>(kZapValue))); 455 mov(scratch1, Immediate(BitCast<int32_t>(kZapValue)));
456 mov(scratch2, Immediate(BitCast<int32_t>(kZapValue))); 456 mov(scratch2, Immediate(BitCast<int32_t>(kZapValue)));
457 } 457 }
458 } 458 }
459 459
460 460
(...skipping 15 matching lines...) Expand all
476 } 476 }
477 477
478 if (emit_debug_code()) { 478 if (emit_debug_code()) {
479 Label ok; 479 Label ok;
480 cmp(value, Operand(address, 0)); 480 cmp(value, Operand(address, 0));
481 j(equal, &ok, Label::kNear); 481 j(equal, &ok, Label::kNear);
482 int3(); 482 int3();
483 bind(&ok); 483 bind(&ok);
484 } 484 }
485 485
486 // Count number of write barriers in generated code.
487 isolate()->counters()->write_barriers_static()->Increment();
488 IncrementCounter(isolate()->counters()->write_barriers_dynamic(), 1);
489
490 // First, check if a write barrier is even needed. The tests below 486 // First, check if a write barrier is even needed. The tests below
491 // catch stores of Smis and stores into young gen. 487 // catch stores of Smis and stores into young gen.
492 Label done; 488 Label done;
493 489
494 if (smi_check == INLINE_SMI_CHECK) { 490 if (smi_check == INLINE_SMI_CHECK) {
495 // Skip barrier if writing a smi. 491 // Skip barrier if writing a smi.
496 JumpIfSmi(value, &done, Label::kNear); 492 JumpIfSmi(value, &done, Label::kNear);
497 } 493 }
498 494
499 if (pointers_to_here_check_for_value != kPointersToHereAreAlwaysInteresting) { 495 if (pointers_to_here_check_for_value != kPointersToHereAreAlwaysInteresting) {
(...skipping 10 matching lines...) Expand all
510 zero, 506 zero,
511 &done, 507 &done,
512 Label::kNear); 508 Label::kNear);
513 509
514 RecordWriteStub stub(isolate(), object, value, address, 510 RecordWriteStub stub(isolate(), object, value, address,
515 remembered_set_action); 511 remembered_set_action);
516 CallStub(&stub); 512 CallStub(&stub);
517 513
518 bind(&done); 514 bind(&done);
519 515
516 // Count number of write barriers in generated code.
517 isolate()->counters()->write_barriers_static()->Increment();
518 IncrementCounter(isolate()->counters()->write_barriers_dynamic(), 1);
519
520 // Clobber clobbered registers when running with the debug-code flag 520 // Clobber clobbered registers when running with the debug-code flag
521 // turned on to provoke errors. 521 // turned on to provoke errors.
522 if (emit_debug_code()) { 522 if (emit_debug_code()) {
523 mov(address, Immediate(BitCast<int32_t>(kZapValue))); 523 mov(address, Immediate(BitCast<int32_t>(kZapValue)));
524 mov(value, Immediate(BitCast<int32_t>(kZapValue))); 524 mov(value, Immediate(BitCast<int32_t>(kZapValue)));
525 } 525 }
526 } 526 }
527 527
528 528
529 void MacroAssembler::DebugBreak() { 529 void MacroAssembler::DebugBreak() {
(...skipping 2787 matching lines...) Expand 10 before | Expand all | Expand 10 after
3317 if (ms.shift() > 0) sar(edx, ms.shift()); 3317 if (ms.shift() > 0) sar(edx, ms.shift());
3318 mov(eax, dividend); 3318 mov(eax, dividend);
3319 shr(eax, 31); 3319 shr(eax, 31);
3320 add(edx, eax); 3320 add(edx, eax);
3321 } 3321 }
3322 3322
3323 3323
3324 } } // namespace v8::internal 3324 } } // namespace v8::internal
3325 3325
3326 #endif // V8_TARGET_ARCH_X87 3326 #endif // V8_TARGET_ARCH_X87
OLDNEW
« no previous file with comments | « src/x64/macro-assembler-x64.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698