Reviewers: Vyacheslav Egorov,

Description:
Use near labels in write barrier code.

Please review this at http://codereview.chromium.org/5939003/

Affected files:
  M src/ia32/macro-assembler-ia32.h
  M src/ia32/macro-assembler-ia32.cc


Index: src/ia32/macro-assembler-ia32.cc
diff --git a/src/ia32/macro-assembler-ia32.cc b/src/ia32/macro-assembler-ia32.cc index 6c51d6859c291f4d392f0695f05b0f18ac0f1bcc..b3cda4999efb9d8cc47c7c9fb22924622e02e1ee 100644
--- a/src/ia32/macro-assembler-ia32.cc
+++ b/src/ia32/macro-assembler-ia32.cc
@@ -98,6 +98,30 @@ void MacroAssembler::InNewSpace(Register object,
 }


+void MacroAssembler::InNewSpace(Register object,
+                                Register scratch,
+                                Condition cc,
+                                NearLabel* branch) {
+  ASSERT(cc == equal || cc == not_equal);
+  if (Serializer::enabled()) {
+ // Can't do arithmetic on external references if it might get serialized.
+    mov(scratch, Operand(object));
+ // The mask isn't really an address. We load it as an external reference in + // case the size of the new space is different between the snapshot maker
+    // and the running system.
+    and_(Operand(scratch), Immediate(ExternalReference::new_space_mask()));
+    cmp(Operand(scratch), Immediate(ExternalReference::new_space_start()));
+    j(cc, branch);
+  } else {
+    int32_t new_space_start = reinterpret_cast<int32_t>(
+        ExternalReference::new_space_start().address());
+    lea(scratch, Operand(object, -new_space_start));
+    and_(scratch, Heap::NewSpaceMask());
+    j(cc, branch);
+  }
+}
+
+
 void MacroAssembler::RecordWrite(Register object,
                                  int offset,
                                  Register value,
@@ -109,7 +133,7 @@ void MacroAssembler::RecordWrite(Register object,

   // First, check if a write barrier is even needed. The tests below
   // catch stores of Smis and stores into young gen.
-  Label done;
+  NearLabel done;

   // Skip barrier if writing a smi.
   ASSERT_EQ(0, kSmiTag);
Index: src/ia32/macro-assembler-ia32.h
diff --git a/src/ia32/macro-assembler-ia32.h b/src/ia32/macro-assembler-ia32.h index 8407802104dee42e20b9f284caa1856f1fa302d9..f9d7d04dfd7705427d6e2a94e3cffd9f234e2a07 100644
--- a/src/ia32/macro-assembler-ia32.h
+++ b/src/ia32/macro-assembler-ia32.h
@@ -74,6 +74,10 @@ class MacroAssembler: public Assembler {
                   Register scratch,
Condition cc, // equal for new space, not_equal otherwise.
                   Label* branch);
+  void InNewSpace(Register object,
+                  Register scratch,
+ Condition cc, // equal for new space, not_equal otherwise.
+                  NearLabel* branch);

   // For page containing |object| mark region covering [object+offset]
   // dirty. |object| is the object being stored into, |value| is the


--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to