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

Reply via email to