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