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..6f5fa87297191df91f483cb736d4baf598918308 100644 |
--- a/src/ia32/macro-assembler-ia32.h |
+++ b/src/ia32/macro-assembler-ia32.h |
@@ -70,10 +70,11 @@ class MacroAssembler: public Assembler { |
// Check if object is in new space. |
// scratch can be object itself, but it will be clobbered. |
+ template <typename LabelType> |
void InNewSpace(Register object, |
Register scratch, |
Condition cc, // equal for new space, not_equal otherwise. |
- Label* branch); |
+ LabelType* branch); |
// For page containing |object| mark region covering [object+offset] |
// dirty. |object| is the object being stored into, |value| is the |
@@ -658,6 +659,31 @@ class MacroAssembler: public Assembler { |
}; |
+template <typename LabelType> |
+void MacroAssembler::InNewSpace(Register object, |
+ Register scratch, |
+ Condition cc, |
+ LabelType* 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); |
+ } |
+} |
+ |
+ |
// The code patcher is used to patch (typically) small parts of code e.g. for |
// debugging and other types of instrumentation. When using the code patcher |
// the exact number of bytes specified must be emitted. Is not legal to emit |