| Index: src/heap/mark-compact.cc
|
| diff --git a/src/heap/mark-compact.cc b/src/heap/mark-compact.cc
|
| index a58b0678b5fae004175fb8935372c8ee9559d7b4..af366eb1bcb51782da76cea4460b4d9ce81a30b0 100644
|
| --- a/src/heap/mark-compact.cc
|
| +++ b/src/heap/mark-compact.cc
|
| @@ -1488,7 +1488,8 @@ void MarkCompactCollector::DiscoverGreyObjectsWithIterator(T* it) {
|
| }
|
|
|
|
|
| -static inline int MarkWordToObjectStarts(uint32_t mark_bits, int* starts);
|
| +static inline int MarkWordToObjectStarts(uint32_t mark_bits, Address base,
|
| + Address* starts);
|
|
|
|
|
| void MarkCompactCollector::DiscoverGreyObjectsOnPage(MemoryChunk* p) {
|
| @@ -3176,17 +3177,16 @@ bool MarkCompactCollector::EvacuateLiveObjectsFromPage(
|
| AlwaysAllocateScope always_allocate(isolate());
|
| DCHECK(p->IsEvacuationCandidate() && !p->WasSwept());
|
|
|
| - int offsets[16];
|
| + Address starts[16];
|
| for (MarkBitCellIterator it(p); !it.Done(); it.Advance()) {
|
| Address cell_base = it.CurrentCellBase();
|
| MarkBit::CellType* cell = it.CurrentCell();
|
|
|
| if (*cell == 0) continue;
|
|
|
| - int live_objects = MarkWordToObjectStarts(*cell, offsets);
|
| + int live_objects = MarkWordToObjectStarts(*cell, cell_base, starts);
|
| for (int i = 0; i < live_objects; i++) {
|
| - Address object_addr = cell_base + offsets[i] * kPointerSize;
|
| - HeapObject* object = HeapObject::FromAddress(object_addr);
|
| + HeapObject* object = HeapObject::FromAddress(starts[i]);
|
| DCHECK(Marking::IsBlack(Marking::MarkBitFrom(object)));
|
|
|
| int size = object->Size();
|
| @@ -3198,7 +3198,7 @@ bool MarkCompactCollector::EvacuateLiveObjectsFromPage(
|
| // the mark bits for objects that have already been migrated.
|
| if (i > 0) {
|
| p->markbits()->ClearRange(p->AddressToMarkbitIndex(p->area_start()),
|
| - p->AddressToMarkbitIndex(object_addr));
|
| + p->AddressToMarkbitIndex(starts[i]));
|
| }
|
| return false;
|
| }
|
| @@ -3469,7 +3469,7 @@ static int Sweep(PagedSpace* space, FreeList* free_list, Page* p,
|
|
|
| Address free_start = p->area_start();
|
| DCHECK(reinterpret_cast<intptr_t>(free_start) % (32 * kPointerSize) == 0);
|
| - int offsets[16];
|
| + Address starts[16];
|
|
|
| // If we use the skip list for code space pages, we have to lock the skip
|
| // list because it could be accessed concurrently by the runtime or the
|
| @@ -3486,10 +3486,10 @@ static int Sweep(PagedSpace* space, FreeList* free_list, Page* p,
|
| for (MarkBitCellIterator it(p); !it.Done(); it.Advance()) {
|
| Address cell_base = it.CurrentCellBase();
|
| MarkBit::CellType* cell = it.CurrentCell();
|
| - int live_objects = MarkWordToObjectStarts(*cell, offsets);
|
| + int live_objects = MarkWordToObjectStarts(*cell, cell_base, starts);
|
| int live_index = 0;
|
| for (; live_objects != 0; live_objects--) {
|
| - Address free_end = cell_base + offsets[live_index++] * kPointerSize;
|
| + Address free_end = starts[live_index++];
|
| if (free_end != free_start) {
|
| int size = static_cast<int>(free_end - free_start);
|
| if (free_space_mode == ZAP_FREE_SPACE) {
|
| @@ -3584,15 +3584,14 @@ void MarkCompactCollector::RemoveObjectSlots(Address start_slot,
|
| void MarkCompactCollector::VisitLiveObjects(Page* page,
|
| ObjectVisitor* visitor) {
|
| // First pass on aborted pages.
|
| - int offsets[16];
|
| + Address starts[16];
|
| for (MarkBitCellIterator it(page); !it.Done(); it.Advance()) {
|
| Address cell_base = it.CurrentCellBase();
|
| MarkBit::CellType* cell = it.CurrentCell();
|
| if (*cell == 0) continue;
|
| - int live_objects = MarkWordToObjectStarts(*cell, offsets);
|
| + int live_objects = MarkWordToObjectStarts(*cell, cell_base, starts);
|
| for (int i = 0; i < live_objects; i++) {
|
| - Address object_addr = cell_base + offsets[i] * kPointerSize;
|
| - HeapObject* live_object = HeapObject::FromAddress(object_addr);
|
| + HeapObject* live_object = HeapObject::FromAddress(starts[i]);
|
| DCHECK(Marking::IsBlack(Marking::MarkBitFrom(live_object)));
|
| Map* map = live_object->synchronized_map();
|
| int size = live_object->SizeFromMap(map);
|
| @@ -3829,395 +3828,21 @@ void MarkCompactCollector::ReleaseEvacuationCandidates() {
|
| }
|
|
|
|
|
| -static const int kStartTableEntriesPerLine = 5;
|
| -static const int kStartTableLines = 171;
|
| -static const int kStartTableInvalidLine = 127;
|
| -static const int kStartTableUnusedEntry = 126;
|
| -
|
| -#define _ kStartTableUnusedEntry
|
| -#define X kStartTableInvalidLine
|
| -// Mark-bit to object start offset table.
|
| -//
|
| -// The line is indexed by the mark bits in a byte. The first number on
|
| -// the line describes the number of live object starts for the line and the
|
| -// other numbers on the line describe the offsets (in words) of the object
|
| -// starts.
|
| -//
|
| -// Since objects are at least 2 words large we don't have entries for two
|
| -// consecutive 1 bits. All entries after 170 have at least 2 consecutive bits.
|
| -char kStartTable[kStartTableLines * kStartTableEntriesPerLine] = {
|
| - 0, _, _,
|
| - _, _, // 0
|
| - 1, 0, _,
|
| - _, _, // 1
|
| - 1, 1, _,
|
| - _, _, // 2
|
| - X, _, _,
|
| - _, _, // 3
|
| - 1, 2, _,
|
| - _, _, // 4
|
| - 2, 0, 2,
|
| - _, _, // 5
|
| - X, _, _,
|
| - _, _, // 6
|
| - X, _, _,
|
| - _, _, // 7
|
| - 1, 3, _,
|
| - _, _, // 8
|
| - 2, 0, 3,
|
| - _, _, // 9
|
| - 2, 1, 3,
|
| - _, _, // 10
|
| - X, _, _,
|
| - _, _, // 11
|
| - X, _, _,
|
| - _, _, // 12
|
| - X, _, _,
|
| - _, _, // 13
|
| - X, _, _,
|
| - _, _, // 14
|
| - X, _, _,
|
| - _, _, // 15
|
| - 1, 4, _,
|
| - _, _, // 16
|
| - 2, 0, 4,
|
| - _, _, // 17
|
| - 2, 1, 4,
|
| - _, _, // 18
|
| - X, _, _,
|
| - _, _, // 19
|
| - 2, 2, 4,
|
| - _, _, // 20
|
| - 3, 0, 2,
|
| - 4, _, // 21
|
| - X, _, _,
|
| - _, _, // 22
|
| - X, _, _,
|
| - _, _, // 23
|
| - X, _, _,
|
| - _, _, // 24
|
| - X, _, _,
|
| - _, _, // 25
|
| - X, _, _,
|
| - _, _, // 26
|
| - X, _, _,
|
| - _, _, // 27
|
| - X, _, _,
|
| - _, _, // 28
|
| - X, _, _,
|
| - _, _, // 29
|
| - X, _, _,
|
| - _, _, // 30
|
| - X, _, _,
|
| - _, _, // 31
|
| - 1, 5, _,
|
| - _, _, // 32
|
| - 2, 0, 5,
|
| - _, _, // 33
|
| - 2, 1, 5,
|
| - _, _, // 34
|
| - X, _, _,
|
| - _, _, // 35
|
| - 2, 2, 5,
|
| - _, _, // 36
|
| - 3, 0, 2,
|
| - 5, _, // 37
|
| - X, _, _,
|
| - _, _, // 38
|
| - X, _, _,
|
| - _, _, // 39
|
| - 2, 3, 5,
|
| - _, _, // 40
|
| - 3, 0, 3,
|
| - 5, _, // 41
|
| - 3, 1, 3,
|
| - 5, _, // 42
|
| - X, _, _,
|
| - _, _, // 43
|
| - X, _, _,
|
| - _, _, // 44
|
| - X, _, _,
|
| - _, _, // 45
|
| - X, _, _,
|
| - _, _, // 46
|
| - X, _, _,
|
| - _, _, // 47
|
| - X, _, _,
|
| - _, _, // 48
|
| - X, _, _,
|
| - _, _, // 49
|
| - X, _, _,
|
| - _, _, // 50
|
| - X, _, _,
|
| - _, _, // 51
|
| - X, _, _,
|
| - _, _, // 52
|
| - X, _, _,
|
| - _, _, // 53
|
| - X, _, _,
|
| - _, _, // 54
|
| - X, _, _,
|
| - _, _, // 55
|
| - X, _, _,
|
| - _, _, // 56
|
| - X, _, _,
|
| - _, _, // 57
|
| - X, _, _,
|
| - _, _, // 58
|
| - X, _, _,
|
| - _, _, // 59
|
| - X, _, _,
|
| - _, _, // 60
|
| - X, _, _,
|
| - _, _, // 61
|
| - X, _, _,
|
| - _, _, // 62
|
| - X, _, _,
|
| - _, _, // 63
|
| - 1, 6, _,
|
| - _, _, // 64
|
| - 2, 0, 6,
|
| - _, _, // 65
|
| - 2, 1, 6,
|
| - _, _, // 66
|
| - X, _, _,
|
| - _, _, // 67
|
| - 2, 2, 6,
|
| - _, _, // 68
|
| - 3, 0, 2,
|
| - 6, _, // 69
|
| - X, _, _,
|
| - _, _, // 70
|
| - X, _, _,
|
| - _, _, // 71
|
| - 2, 3, 6,
|
| - _, _, // 72
|
| - 3, 0, 3,
|
| - 6, _, // 73
|
| - 3, 1, 3,
|
| - 6, _, // 74
|
| - X, _, _,
|
| - _, _, // 75
|
| - X, _, _,
|
| - _, _, // 76
|
| - X, _, _,
|
| - _, _, // 77
|
| - X, _, _,
|
| - _, _, // 78
|
| - X, _, _,
|
| - _, _, // 79
|
| - 2, 4, 6,
|
| - _, _, // 80
|
| - 3, 0, 4,
|
| - 6, _, // 81
|
| - 3, 1, 4,
|
| - 6, _, // 82
|
| - X, _, _,
|
| - _, _, // 83
|
| - 3, 2, 4,
|
| - 6, _, // 84
|
| - 4, 0, 2,
|
| - 4, 6, // 85
|
| - X, _, _,
|
| - _, _, // 86
|
| - X, _, _,
|
| - _, _, // 87
|
| - X, _, _,
|
| - _, _, // 88
|
| - X, _, _,
|
| - _, _, // 89
|
| - X, _, _,
|
| - _, _, // 90
|
| - X, _, _,
|
| - _, _, // 91
|
| - X, _, _,
|
| - _, _, // 92
|
| - X, _, _,
|
| - _, _, // 93
|
| - X, _, _,
|
| - _, _, // 94
|
| - X, _, _,
|
| - _, _, // 95
|
| - X, _, _,
|
| - _, _, // 96
|
| - X, _, _,
|
| - _, _, // 97
|
| - X, _, _,
|
| - _, _, // 98
|
| - X, _, _,
|
| - _, _, // 99
|
| - X, _, _,
|
| - _, _, // 100
|
| - X, _, _,
|
| - _, _, // 101
|
| - X, _, _,
|
| - _, _, // 102
|
| - X, _, _,
|
| - _, _, // 103
|
| - X, _, _,
|
| - _, _, // 104
|
| - X, _, _,
|
| - _, _, // 105
|
| - X, _, _,
|
| - _, _, // 106
|
| - X, _, _,
|
| - _, _, // 107
|
| - X, _, _,
|
| - _, _, // 108
|
| - X, _, _,
|
| - _, _, // 109
|
| - X, _, _,
|
| - _, _, // 110
|
| - X, _, _,
|
| - _, _, // 111
|
| - X, _, _,
|
| - _, _, // 112
|
| - X, _, _,
|
| - _, _, // 113
|
| - X, _, _,
|
| - _, _, // 114
|
| - X, _, _,
|
| - _, _, // 115
|
| - X, _, _,
|
| - _, _, // 116
|
| - X, _, _,
|
| - _, _, // 117
|
| - X, _, _,
|
| - _, _, // 118
|
| - X, _, _,
|
| - _, _, // 119
|
| - X, _, _,
|
| - _, _, // 120
|
| - X, _, _,
|
| - _, _, // 121
|
| - X, _, _,
|
| - _, _, // 122
|
| - X, _, _,
|
| - _, _, // 123
|
| - X, _, _,
|
| - _, _, // 124
|
| - X, _, _,
|
| - _, _, // 125
|
| - X, _, _,
|
| - _, _, // 126
|
| - X, _, _,
|
| - _, _, // 127
|
| - 1, 7, _,
|
| - _, _, // 128
|
| - 2, 0, 7,
|
| - _, _, // 129
|
| - 2, 1, 7,
|
| - _, _, // 130
|
| - X, _, _,
|
| - _, _, // 131
|
| - 2, 2, 7,
|
| - _, _, // 132
|
| - 3, 0, 2,
|
| - 7, _, // 133
|
| - X, _, _,
|
| - _, _, // 134
|
| - X, _, _,
|
| - _, _, // 135
|
| - 2, 3, 7,
|
| - _, _, // 136
|
| - 3, 0, 3,
|
| - 7, _, // 137
|
| - 3, 1, 3,
|
| - 7, _, // 138
|
| - X, _, _,
|
| - _, _, // 139
|
| - X, _, _,
|
| - _, _, // 140
|
| - X, _, _,
|
| - _, _, // 141
|
| - X, _, _,
|
| - _, _, // 142
|
| - X, _, _,
|
| - _, _, // 143
|
| - 2, 4, 7,
|
| - _, _, // 144
|
| - 3, 0, 4,
|
| - 7, _, // 145
|
| - 3, 1, 4,
|
| - 7, _, // 146
|
| - X, _, _,
|
| - _, _, // 147
|
| - 3, 2, 4,
|
| - 7, _, // 148
|
| - 4, 0, 2,
|
| - 4, 7, // 149
|
| - X, _, _,
|
| - _, _, // 150
|
| - X, _, _,
|
| - _, _, // 151
|
| - X, _, _,
|
| - _, _, // 152
|
| - X, _, _,
|
| - _, _, // 153
|
| - X, _, _,
|
| - _, _, // 154
|
| - X, _, _,
|
| - _, _, // 155
|
| - X, _, _,
|
| - _, _, // 156
|
| - X, _, _,
|
| - _, _, // 157
|
| - X, _, _,
|
| - _, _, // 158
|
| - X, _, _,
|
| - _, _, // 159
|
| - 2, 5, 7,
|
| - _, _, // 160
|
| - 3, 0, 5,
|
| - 7, _, // 161
|
| - 3, 1, 5,
|
| - 7, _, // 162
|
| - X, _, _,
|
| - _, _, // 163
|
| - 3, 2, 5,
|
| - 7, _, // 164
|
| - 4, 0, 2,
|
| - 5, 7, // 165
|
| - X, _, _,
|
| - _, _, // 166
|
| - X, _, _,
|
| - _, _, // 167
|
| - 3, 3, 5,
|
| - 7, _, // 168
|
| - 4, 0, 3,
|
| - 5, 7, // 169
|
| - 4, 1, 3,
|
| - 5, 7 // 170
|
| -};
|
| -#undef _
|
| -#undef X
|
| -
|
| -
|
| -// Takes a word of mark bits. Returns the number of objects that start in the
|
| -// range. Puts the offsets of the words in the supplied array.
|
| -static inline int MarkWordToObjectStarts(uint32_t mark_bits, int* starts) {
|
| +// Takes a word of mark bits and a base address. Returns the number of objects
|
| +// that start in the range. Puts the object starts in the supplied array.
|
| +static inline int MarkWordToObjectStarts(uint32_t mark_bits, Address base,
|
| + Address* starts) {
|
| int objects = 0;
|
| - int offset = 0;
|
|
|
| // No consecutive 1 bits.
|
| DCHECK((mark_bits & 0x180) != 0x180);
|
| DCHECK((mark_bits & 0x18000) != 0x18000);
|
| DCHECK((mark_bits & 0x1800000) != 0x1800000);
|
|
|
| - while (mark_bits != 0) {
|
| - int byte = (mark_bits & 0xff);
|
| - mark_bits >>= 8;
|
| - if (byte != 0) {
|
| - DCHECK(byte < kStartTableLines); // No consecutive 1 bits.
|
| - char* table = kStartTable + byte * kStartTableEntriesPerLine;
|
| - int objects_in_these_8_words = table[0];
|
| - DCHECK(objects_in_these_8_words != kStartTableInvalidLine);
|
| - DCHECK(objects_in_these_8_words < kStartTableEntriesPerLine);
|
| - for (int i = 0; i < objects_in_these_8_words; i++) {
|
| - starts[objects++] = offset + table[1 + i];
|
| - }
|
| - }
|
| - offset += 8;
|
| + unsigned index = 0;
|
| + while ((index = base::bits::CountTrailingZeros32(mark_bits)) != 32) {
|
| + starts[objects++] = base + kPointerSize * index;
|
| + mark_bits &= ~(1u << index);
|
| }
|
| return objects;
|
| }
|
|
|