| Index: src/ia32/macro-assembler-ia32.cc
|
| diff --git a/src/ia32/macro-assembler-ia32.cc b/src/ia32/macro-assembler-ia32.cc
|
| index 6c02635a1385c80f30dd3946c8819404eb8c2784..dd9bd7e184e3c95231b77e84607494f38e68562e 100644
|
| --- a/src/ia32/macro-assembler-ia32.cc
|
| +++ b/src/ia32/macro-assembler-ia32.cc
|
| @@ -47,33 +47,32 @@ MacroAssembler::MacroAssembler(void* buffer, int size)
|
| }
|
|
|
|
|
| -static void RecordWriteHelper(MacroAssembler* masm,
|
| - Register object,
|
| - Register addr,
|
| - Register scratch) {
|
| +void MacroAssembler::RecordWriteHelper(Register object,
|
| + Register addr,
|
| + Register scratch) {
|
| Label fast;
|
|
|
| // Compute the page start address from the heap object pointer, and reuse
|
| // the 'object' register for it.
|
| - masm->and_(object, ~Page::kPageAlignmentMask);
|
| + and_(object, ~Page::kPageAlignmentMask);
|
| Register page_start = object;
|
|
|
| // Compute the bit addr in the remembered set/index of the pointer in the
|
| // page. Reuse 'addr' as pointer_offset.
|
| - masm->sub(addr, Operand(page_start));
|
| - masm->shr(addr, kObjectAlignmentBits);
|
| + sub(addr, Operand(page_start));
|
| + shr(addr, kObjectAlignmentBits);
|
| Register pointer_offset = addr;
|
|
|
| // If the bit offset lies beyond the normal remembered set range, it is in
|
| // the extra remembered set area of a large object.
|
| - masm->cmp(pointer_offset, Page::kPageSize / kPointerSize);
|
| - masm->j(less, &fast);
|
| + cmp(pointer_offset, Page::kPageSize / kPointerSize);
|
| + j(less, &fast);
|
|
|
| // Adjust 'page_start' so that addressing using 'pointer_offset' hits the
|
| // extra remembered set after the large object.
|
|
|
| // Find the length of the large object (FixedArray).
|
| - masm->mov(scratch, Operand(page_start, Page::kObjectStartOffset
|
| + mov(scratch, Operand(page_start, Page::kObjectStartOffset
|
| + FixedArray::kLengthOffset));
|
| Register array_length = scratch;
|
|
|
| @@ -83,59 +82,40 @@ static void RecordWriteHelper(MacroAssembler* masm,
|
| // Add the delta between the end of the normal RSet and the start of the
|
| // extra RSet to 'page_start', so that addressing the bit using
|
| // 'pointer_offset' hits the extra RSet words.
|
| - masm->lea(page_start,
|
| - Operand(page_start, array_length, times_pointer_size,
|
| - Page::kObjectStartOffset + FixedArray::kHeaderSize
|
| - - Page::kRSetEndOffset));
|
| + lea(page_start,
|
| + Operand(page_start, array_length, times_pointer_size,
|
| + Page::kObjectStartOffset + FixedArray::kHeaderSize
|
| + - Page::kRSetEndOffset));
|
|
|
| // NOTE: For now, we use the bit-test-and-set (bts) x86 instruction
|
| // to limit code size. We should probably evaluate this decision by
|
| // measuring the performance of an equivalent implementation using
|
| // "simpler" instructions
|
| - masm->bind(&fast);
|
| - masm->bts(Operand(page_start, Page::kRSetOffset), pointer_offset);
|
| + bind(&fast);
|
| + bts(Operand(page_start, Page::kRSetOffset), pointer_offset);
|
| }
|
|
|
|
|
| -class RecordWriteStub : public CodeStub {
|
| - public:
|
| - RecordWriteStub(Register object, Register addr, Register scratch)
|
| - : object_(object), addr_(addr), scratch_(scratch) { }
|
| -
|
| - void Generate(MacroAssembler* masm);
|
| -
|
| - private:
|
| - Register object_;
|
| - Register addr_;
|
| - Register scratch_;
|
| -
|
| -#ifdef DEBUG
|
| - void Print() {
|
| - PrintF("RecordWriteStub (object reg %d), (addr reg %d), (scratch reg %d)\n",
|
| - object_.code(), addr_.code(), scratch_.code());
|
| - }
|
| -#endif
|
| -
|
| - // Minor key encoding in 12 bits of three registers (object, address and
|
| - // scratch) OOOOAAAASSSS.
|
| - class ScratchBits: public BitField<uint32_t, 0, 4> {};
|
| - class AddressBits: public BitField<uint32_t, 4, 4> {};
|
| - class ObjectBits: public BitField<uint32_t, 8, 4> {};
|
| -
|
| - Major MajorKey() { return RecordWrite; }
|
| -
|
| - int MinorKey() {
|
| - // Encode the registers.
|
| - return ObjectBits::encode(object_.code()) |
|
| - AddressBits::encode(addr_.code()) |
|
| - ScratchBits::encode(scratch_.code());
|
| +void MacroAssembler::InNewSpace(Register object,
|
| + Register scratch,
|
| + Condition cc,
|
| + Label* branch) {
|
| + 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 RecordWriteStub::Generate(MacroAssembler* masm) {
|
| - RecordWriteHelper(masm, object_, addr_, scratch_);
|
| - masm->ret(0);
|
| }
|
|
|
|
|
| @@ -161,22 +141,7 @@ void MacroAssembler::RecordWrite(Register object, int offset,
|
| test(value, Immediate(kSmiTagMask));
|
| j(zero, &done);
|
|
|
| - if (Serializer::enabled()) {
|
| - // Can't do arithmetic on external references if it might get serialized.
|
| - mov(value, 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(value), Immediate(ExternalReference::new_space_mask()));
|
| - cmp(Operand(value), Immediate(ExternalReference::new_space_start()));
|
| - j(equal, &done);
|
| - } else {
|
| - int32_t new_space_start = reinterpret_cast<int32_t>(
|
| - ExternalReference::new_space_start().address());
|
| - lea(value, Operand(object, -new_space_start));
|
| - and_(value, Heap::NewSpaceMask());
|
| - j(equal, &done);
|
| - }
|
| + InNewSpace(object, value, equal, &done);
|
|
|
| if ((offset > 0) && (offset < Page::kMaxHeapObjectSize)) {
|
| // Compute the bit offset in the remembered set, leave it in 'value'.
|
| @@ -209,7 +174,7 @@ void MacroAssembler::RecordWrite(Register object, int offset,
|
| // If we are already generating a shared stub, not inlining the
|
| // record write code isn't going to save us any memory.
|
| if (generating_stub()) {
|
| - RecordWriteHelper(this, object, dst, value);
|
| + RecordWriteHelper(object, dst, value);
|
| } else {
|
| RecordWriteStub stub(object, dst, value);
|
| CallStub(&stub);
|
|
|