Revision: 3757
Author: [email protected]
Date: Mon Feb 1 05:20:43 2010
Log: Avoid using RecordWrite with the context (esi, rsi, cp) as
one of the arguments since this may clobber the register.
Review URL: http://codereview.chromium.org/556101
http://code.google.com/p/v8/source/detail?r=3757
Modified:
/branches/bleeding_edge/src/arm/full-codegen-arm.cc
/branches/bleeding_edge/src/arm/macro-assembler-arm.cc
/branches/bleeding_edge/src/ia32/full-codegen-ia32.cc
/branches/bleeding_edge/src/ia32/macro-assembler-ia32.cc
/branches/bleeding_edge/src/x64/full-codegen-x64.cc
/branches/bleeding_edge/src/x64/macro-assembler-x64.cc
=======================================
--- /branches/bleeding_edge/src/arm/full-codegen-arm.cc Thu Jan 28 01:08:01
2010
+++ /branches/bleeding_edge/src/arm/full-codegen-arm.cc Mon Feb 1 05:20:43
2010
@@ -581,7 +581,8 @@
int offset = Context::SlotOffset(slot->index());
__ mov(r2, Operand(offset));
// We know that we have written a function, which is not a smi.
- __ RecordWrite(cp, r2, result_register());
+ __ mov(r1, Operand(cp));
+ __ RecordWrite(r1, r2, result_register());
}
break;
=======================================
--- /branches/bleeding_edge/src/arm/macro-assembler-arm.cc Fri Jan 29
04:41:11 2010
+++ /branches/bleeding_edge/src/arm/macro-assembler-arm.cc Mon Feb 1
05:20:43 2010
@@ -205,6 +205,11 @@
// tag is shifted away.
void MacroAssembler::RecordWrite(Register object, Register offset,
Register scratch) {
+ // The compiled code assumes that record write doesn't change the
+ // context register, so we check that none of the clobbered
+ // registers are cp.
+ ASSERT(!object.is(cp) && !offset.is(cp) && !scratch.is(cp));
+
// This is how much we shift the remembered set bit offset to get the
// offset of the word in the remembered set. We divide by kBitsPerInt
(32,
// shift right 5) and then multiply by kIntSize (4, shift left 2).
=======================================
--- /branches/bleeding_edge/src/ia32/full-codegen-ia32.cc Mon Feb 1
00:35:38 2010
+++ /branches/bleeding_edge/src/ia32/full-codegen-ia32.cc Mon Feb 1
05:20:43 2010
@@ -695,7 +695,8 @@
__ mov(CodeGenerator::ContextOperand(esi, slot->index()),
result_register());
int offset = Context::SlotOffset(slot->index());
- __ RecordWrite(esi, offset, result_register(), ecx);
+ __ mov(ebx, esi);
+ __ RecordWrite(ebx, offset, result_register(), ecx);
}
break;
=======================================
--- /branches/bleeding_edge/src/ia32/macro-assembler-ia32.cc Fri Jan 29
04:41:11 2010
+++ /branches/bleeding_edge/src/ia32/macro-assembler-ia32.cc Mon Feb 1
05:20:43 2010
@@ -147,6 +147,11 @@
// All registers are clobbered by the operation.
void MacroAssembler::RecordWrite(Register object, int offset,
Register value, Register scratch) {
+ // The compiled code assumes that record write doesn't change the
+ // context register, so we check that none of the clobbered
+ // registers are esi.
+ ASSERT(!object.is(esi) && !value.is(esi) && !scratch.is(esi));
+
// First, check if a remembered set write is even needed. The tests below
// catch stores of Smis and stores into young gen (which does not have
space
// for the remembered set bits.
=======================================
--- /branches/bleeding_edge/src/x64/full-codegen-x64.cc Thu Jan 28 04:45:14
2010
+++ /branches/bleeding_edge/src/x64/full-codegen-x64.cc Mon Feb 1 05:20:43
2010
@@ -698,7 +698,8 @@
__ movq(CodeGenerator::ContextOperand(rsi, slot->index()),
result_register());
int offset = Context::SlotOffset(slot->index());
- __ RecordWrite(rsi, offset, result_register(), rcx);
+ __ movq(rbx, rsi);
+ __ RecordWrite(rbx, offset, result_register(), rcx);
}
break;
=======================================
--- /branches/bleeding_edge/src/x64/macro-assembler-x64.cc Fri Jan 29
04:41:11 2010
+++ /branches/bleeding_edge/src/x64/macro-assembler-x64.cc Mon Feb 1
05:20:43 2010
@@ -178,6 +178,11 @@
int offset,
Register value,
Register smi_index) {
+ // The compiled code assumes that record write doesn't change the
+ // context register, so we check that none of the clobbered
+ // registers are rsi.
+ ASSERT(!object.is(rsi) && !value.is(rsi) && !smi_index.is(rsi));
+
// First, check if a remembered set write is even needed. The tests below
// catch stores of Smis and stores into young gen (which does not have
space
// for the remembered set bits.
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev