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

Reply via email to