| Index: src/x64/macro-assembler-x64.cc
|
| ===================================================================
|
| --- src/x64/macro-assembler-x64.cc (revision 4559)
|
| +++ src/x64/macro-assembler-x64.cc (working copy)
|
| @@ -72,35 +72,34 @@
|
| }
|
|
|
|
|
| -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.
|
| ASSERT(is_int32(~Page::kPageAlignmentMask));
|
| - masm->and_(object,
|
| - Immediate(static_cast<int32_t>(~Page::kPageAlignmentMask)));
|
| + and_(object,
|
| + Immediate(static_cast<int32_t>(~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->subq(addr, page_start);
|
| - masm->shr(addr, Immediate(kPointerSizeLog2));
|
| + subq(addr, page_start);
|
| + shr(addr, Immediate(kPointerSizeLog2));
|
| 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->cmpq(pointer_offset, Immediate(Page::kPageSize / kPointerSize));
|
| - masm->j(less, &fast);
|
| + cmpq(pointer_offset, Immediate(Page::kPageSize / kPointerSize));
|
| + j(less, &fast);
|
|
|
| // Adjust 'page_start' so that addressing using 'pointer_offset' hits the
|
| // extra remembered set after the large object.
|
|
|
| // Load the array length into 'scratch'.
|
| - masm->movl(scratch,
|
| + movl(scratch,
|
| Operand(page_start,
|
| Page::kObjectStartOffset + FixedArray::kLengthOffset));
|
| Register array_length = scratch;
|
| @@ -111,7 +110,7 @@
|
| // 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,
|
| + lea(page_start,
|
| Operand(page_start, array_length, times_pointer_size,
|
| Page::kObjectStartOffset + FixedArray::kHeaderSize
|
| - Page::kRSetEndOffset));
|
| @@ -120,53 +119,11 @@
|
| // 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 RecordWriteStub::Generate(MacroAssembler* masm) {
|
| - RecordWriteHelper(masm, object_, addr_, scratch_);
|
| - masm->ret(0);
|
| -}
|
| -
|
| -
|
| void MacroAssembler::InNewSpace(Register object,
|
| Register scratch,
|
| Condition cc,
|
| @@ -279,7 +236,7 @@
|
| // 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, scratch);
|
| + RecordWriteHelper(object, dst, scratch);
|
| } else {
|
| RecordWriteStub stub(object, dst, scratch);
|
| CallStub(&stub);
|
|
|