Reviewers: Kevin Millikin, Mads Ager,
Description:
Avoid using RecordWrite with the context (esi, rsi, cp) as
one of the arguments since this may clobber the register.
Please review this at http://codereview.chromium.org/556101
SVN Base: http://v8.googlecode.com/svn/branches/bleeding_edge/
Affected files:
M src/arm/full-codegen-arm.cc
M src/arm/macro-assembler-arm.cc
M src/ia32/full-codegen-ia32.cc
M src/ia32/macro-assembler-ia32.cc
M src/x64/full-codegen-x64.cc
M src/x64/macro-assembler-x64.cc
Index: src/ia32/macro-assembler-ia32.cc
===================================================================
--- src/ia32/macro-assembler-ia32.cc (revision 3745)
+++ src/ia32/macro-assembler-ia32.cc (working copy)
@@ -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.
Index: src/x64/macro-assembler-x64.cc
===================================================================
--- src/x64/macro-assembler-x64.cc (revision 3745)
+++ src/x64/macro-assembler-x64.cc (working copy)
@@ -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.
Index: src/arm/macro-assembler-arm.cc
===================================================================
--- src/arm/macro-assembler-arm.cc (revision 3745)
+++ src/arm/macro-assembler-arm.cc (working copy)
@@ -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).
Index: src/ia32/full-codegen-ia32.cc
===================================================================
--- src/ia32/full-codegen-ia32.cc (revision 3745)
+++ src/ia32/full-codegen-ia32.cc (working copy)
@@ -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;
Index: src/x64/full-codegen-x64.cc
===================================================================
--- src/x64/full-codegen-x64.cc (revision 3745)
+++ src/x64/full-codegen-x64.cc (working copy)
@@ -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;
Index: src/arm/full-codegen-arm.cc
===================================================================
--- src/arm/full-codegen-arm.cc (revision 3745)
+++ src/arm/full-codegen-arm.cc (working copy)
@@ -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;
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev