| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |