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

Unified Diff: src/ia32/macro-assembler-ia32.cc

Issue 6597104: Move IncrementalRecordWrite to a stub. (Closed) Base URL: https://v8.googlecode.com/svn/branches/experimental/gc
Patch Set: Created 9 years, 10 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 side-by-side diff with in-line comments
Download patch
Index: src/ia32/macro-assembler-ia32.cc
diff --git a/src/ia32/macro-assembler-ia32.cc b/src/ia32/macro-assembler-ia32.cc
index 3a582f40170e01c6819387936ba807d88e52559b..bebb293cd4f3c79e73da04eff785dc70cf825ee2 100644
--- a/src/ia32/macro-assembler-ia32.cc
+++ b/src/ia32/macro-assembler-ia32.cc
@@ -49,25 +49,72 @@ MacroAssembler::MacroAssembler(void* buffer, int size)
}
-void MacroAssembler::IncrementalMarkingRecordWrite(Register object,
- Register value,
- Register scratch) {
+void MacroAssembler::IncrementalMarkingRecordWriteHelper(Register object,
+ Register value,
+ Register scratch,
+ ObjectMode object_mode,
+ ValueMode value_mode,
+ ScratchMode scratch_mode) {
ASSERT(!object.is(scratch));
ASSERT(!value.is(scratch));
- push(eax);
- push(ecx);
- push(edx);
+ ASSERT(!value.is(object));
+
+ bool preserve[Register::kNumRegisters];
+
+ for (int i = 0; i < Register::kNumRegisters; i++) preserve[i] = false;
+
+ preserve[eax.code()] = true;
+ preserve[ecx.code()] = true;
+ preserve[edx.code()] = true;
+ preserve[object.code()] = (object_mode == PRESERVE_OBJECT);
+ preserve[value.code()] = (value_mode == PRESERVE_VALUE);
+ preserve[scratch.code()] = (scratch_mode == PRESERVE_SCRATCH);
+
+ for (int i = 0; i < Register::kNumRegisters; i++) {
+ if (preserve[i]) push(Register::from_code(i));
Erik Corry 2011/03/02 12:34:06 SSE2 registers?
+ }
+
PrepareCallCFunction(2, scratch);
mov(Operand(esp, 0 * kPointerSize), object);
mov(Operand(esp, 1 * kPointerSize), value);
CallCFunction(
ExternalReference::incremental_marking_record_write_function(), 2);
- pop(edx);
- pop(ecx);
- pop(eax);
+
+ for (int i = Register::kNumRegisters - 1; i >= 0; i--) {
+ if (preserve[i]) pop(Register::from_code(i));
+ }
+
Erik Corry 2011/03/02 12:34:06 Extra blank line.
Vyacheslav Egorov (Chromium) 2011/03/02 15:11:32 Done.
}
+void MacroAssembler::IncrementalMarkingRecordWrite(Register object,
+ Register value,
+ Register scratch,
+ SmiCheck smi_check,
+ ObjectMode object_mode,
+ ValueMode value_mode,
+ ScratchMode scratch_mode) {
+ if (FLAG_incremental_marking) {
+ Label done;
+
+ if (smi_check == INLINE_SMI_CHECK) {
+ ASSERT_EQ(0, kSmiTag);
+ test(value, Immediate(kSmiTagMask));
+ j(zero, &done);
+ }
+
+ IncrementalMarkingRecordWriteStub stub(
+ object, value, scratch, object_mode, value_mode, scratch_mode);
+ CallStub(&stub);
+
+ if (smi_check == INLINE_SMI_CHECK) {
+ bind(&done);
+ }
+ }
+}
+
Erik Corry 2011/03/02 12:34:06 Extra blank line.
Vyacheslav Egorov (Chromium) 2011/03/02 15:11:32 Done.
+
+
void MacroAssembler::RecordWriteHelper(Register object,
Register addr,
Register scratch,
@@ -115,7 +162,13 @@ void MacroAssembler::RecordWrite(Register object,
test(value, Immediate(kSmiTagMask));
j(zero, &done);
- IncrementalMarkingRecordWrite(object, value, scratch);
+ IncrementalMarkingRecordWrite(object,
+ value,
+ scratch,
+ OMIT_SMI_CHECK,
+ PRESERVE_OBJECT,
+ DESTROY_VALUE,
+ (offset == 0) ? PRESERVE_SCRATCH : DESTROY_SCRATCH);
InNewSpace(object, value, equal, &done);

Powered by Google App Engine
This is Rietveld 408576698