| 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
|
|
|