Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(488)

Unified Diff: src/heap/heap.cc

Issue 1150593003: Clean up aligned allocation code in preparation for SIMD alignments. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Handle filler after object. Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« src/globals.h ('K') | « src/heap/heap.h ('k') | src/heap/spaces.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/heap/heap.cc
diff --git a/src/heap/heap.cc b/src/heap/heap.cc
index 5a10a5cd210ac4da9700d1a746410fc787f93c6c..94e345e7f26fe4cfe3cc5686eb54160f34eacfe8 100644
--- a/src/heap/heap.cc
+++ b/src/heap/heap.cc
@@ -1975,31 +1975,45 @@ STATIC_ASSERT((HeapNumber::kValueOffset & kDoubleAlignmentMask) !=
#endif
-HeapObject* Heap::EnsureAligned(HeapObject* object, int size,
- AllocationAlignment alignment) {
- if (alignment == kDoubleAligned &&
- (OffsetFrom(object->address()) & kDoubleAlignmentMask) != 0) {
- CreateFillerObjectAt(object->address(), kPointerSize);
- return HeapObject::FromAddress(object->address() + kPointerSize);
- } else if (alignment == kDoubleUnaligned &&
- (OffsetFrom(object->address()) & kDoubleAlignmentMask) == 0) {
- CreateFillerObjectAt(object->address(), kPointerSize);
- return HeapObject::FromAddress(object->address() + kPointerSize);
- } else {
- CreateFillerObjectAt(object->address() + size - kPointerSize, kPointerSize);
- return object;
+int GetMaximumMisalignment(AllocationAlignment alignment) {
+ switch (alignment) {
+ case kWordAligned:
+ return 0;
+ case kDoubleAligned:
+ case kDoubleValueAligned:
+ return kDoubleSize / 2;
+ default:
+ UNREACHABLE();
}
}
-HeapObject* Heap::PrecedeWithFiller(HeapObject* object) {
- CreateFillerObjectAt(object->address(), kPointerSize);
- return HeapObject::FromAddress(object->address() + kPointerSize);
+int Heap::GetMisalignment(Address address, AllocationAlignment alignment) {
+ intptr_t offset = OffsetFrom(address);
+ if (alignment == kDoubleAligned && (offset & kDoubleAlignmentMask) != 0)
+ return kPointerSize;
+ if (alignment == kDoubleValueAligned && (offset & kDoubleAlignmentMask) == 0)
+ return kPointerSize;
+ return 0;
+}
+
+
+HeapObject* Heap::PrecedeWithFiller(HeapObject* object, int filler_size) {
+ CreateFillerObjectAt(object->address(), filler_size);
+ return HeapObject::FromAddress(object->address() + filler_size);
}
HeapObject* Heap::DoubleAlignForDeserialization(HeapObject* object, int size) {
- return EnsureAligned(object, size, kDoubleAligned);
+ Address address = object->address();
+ int fill_size = GetMisalignment(address, kDoubleAligned);
+ // If object is not aligned, add fill to align it.
+ if (fill_size) return PrecedeWithFiller(object, kPointerSize);
+
+ // object is aligned. Add fill in the extra space at the end.
+ // TODO(bbudge) Calculate alignment fill earlier to avoid this.
+ CreateFillerObjectAt(address + size - kPointerSize, kPointerSize);
+ return object;
}
@@ -2144,16 +2158,14 @@ class ScavengingVisitor : public StaticVisitorBase {
}
}
- template <int alignment>
+ template <AllocationAlignment alignment>
static inline bool SemiSpaceCopyObject(Map* map, HeapObject** slot,
HeapObject* object, int object_size) {
Heap* heap = map->GetHeap();
DCHECK(heap->AllowedToBeMigrated(object, NEW_SPACE));
- AllocationAlignment align =
- alignment == kDoubleAlignment ? kDoubleAligned : kWordAligned;
AllocationResult allocation =
- heap->new_space()->AllocateRaw(object_size, align);
+ heap->new_space()->AllocateRaw(object_size, alignment);
HeapObject* target = NULL; // Initialization to please compiler.
if (allocation.To(&target)) {
@@ -2175,15 +2187,13 @@ class ScavengingVisitor : public StaticVisitorBase {
}
- template <ObjectContents object_contents, int alignment>
+ template <ObjectContents object_contents, AllocationAlignment alignment>
static inline bool PromoteObject(Map* map, HeapObject** slot,
HeapObject* object, int object_size) {
Heap* heap = map->GetHeap();
- AllocationAlignment align =
- alignment == kDoubleAlignment ? kDoubleAligned : kWordAligned;
AllocationResult allocation =
- heap->old_space()->AllocateRaw(object_size, align);
+ heap->old_space()->AllocateRaw(object_size, alignment);
HeapObject* target = NULL; // Initialization to please compiler.
if (allocation.To(&target)) {
@@ -2207,7 +2217,7 @@ class ScavengingVisitor : public StaticVisitorBase {
}
- template <ObjectContents object_contents, int alignment>
+ template <ObjectContents object_contents, AllocationAlignment alignment>
static inline void EvacuateObject(Map* map, HeapObject** slot,
HeapObject* object, int object_size) {
SLOW_DCHECK(object_size <= Page::kMaxRegularHeapObjectSize);
@@ -2257,12 +2267,17 @@ class ScavengingVisitor : public StaticVisitorBase {
}
}
+#if V8_HOST_ARCH_64_BIT
+#define kObjectAligned kDoubleAligned
+#else
+#define kObjectAligned kWordAligned
+#endif
static inline void EvacuateFixedArray(Map* map, HeapObject** slot,
HeapObject* object) {
int object_size = FixedArray::BodyDescriptor::SizeOf(map, object);
- EvacuateObject<POINTER_OBJECT, kObjectAlignment>(map, slot, object,
- object_size);
+ EvacuateObject<POINTER_OBJECT, kObjectAligned>(map, slot, object,
+ object_size);
}
@@ -2270,32 +2285,28 @@ class ScavengingVisitor : public StaticVisitorBase {
HeapObject* object) {
int length = reinterpret_cast<FixedDoubleArray*>(object)->length();
int object_size = FixedDoubleArray::SizeFor(length);
- EvacuateObject<DATA_OBJECT, kDoubleAlignment>(map, slot, object,
- object_size);
+ EvacuateObject<DATA_OBJECT, kDoubleAligned>(map, slot, object, object_size);
}
static inline void EvacuateFixedTypedArray(Map* map, HeapObject** slot,
HeapObject* object) {
int object_size = reinterpret_cast<FixedTypedArrayBase*>(object)->size();
- EvacuateObject<DATA_OBJECT, kObjectAlignment>(map, slot, object,
- object_size);
+ EvacuateObject<DATA_OBJECT, kObjectAligned>(map, slot, object, object_size);
}
static inline void EvacuateFixedFloat64Array(Map* map, HeapObject** slot,
HeapObject* object) {
int object_size = reinterpret_cast<FixedFloat64Array*>(object)->size();
- EvacuateObject<DATA_OBJECT, kDoubleAlignment>(map, slot, object,
- object_size);
+ EvacuateObject<DATA_OBJECT, kDoubleAligned>(map, slot, object, object_size);
}
static inline void EvacuateByteArray(Map* map, HeapObject** slot,
HeapObject* object) {
int object_size = reinterpret_cast<ByteArray*>(object)->ByteArraySize();
- EvacuateObject<DATA_OBJECT, kObjectAlignment>(map, slot, object,
- object_size);
+ EvacuateObject<DATA_OBJECT, kObjectAligned>(map, slot, object, object_size);
}
@@ -2303,8 +2314,7 @@ class ScavengingVisitor : public StaticVisitorBase {
HeapObject* object) {
int object_size = SeqOneByteString::cast(object)
->SeqOneByteStringSize(map->instance_type());
- EvacuateObject<DATA_OBJECT, kObjectAlignment>(map, slot, object,
- object_size);
+ EvacuateObject<DATA_OBJECT, kObjectAligned>(map, slot, object, object_size);
}
@@ -2312,8 +2322,7 @@ class ScavengingVisitor : public StaticVisitorBase {
HeapObject* object) {
int object_size = SeqTwoByteString::cast(object)
->SeqTwoByteStringSize(map->instance_type());
- EvacuateObject<DATA_OBJECT, kObjectAlignment>(map, slot, object,
- object_size);
+ EvacuateObject<DATA_OBJECT, kObjectAligned>(map, slot, object, object_size);
}
@@ -2350,8 +2359,8 @@ class ScavengingVisitor : public StaticVisitorBase {
}
int object_size = ConsString::kSize;
- EvacuateObject<POINTER_OBJECT, kObjectAlignment>(map, slot, object,
- object_size);
+ EvacuateObject<POINTER_OBJECT, kObjectAligned>(map, slot, object,
+ object_size);
}
template <ObjectContents object_contents>
@@ -2360,14 +2369,14 @@ class ScavengingVisitor : public StaticVisitorBase {
template <int object_size>
static inline void VisitSpecialized(Map* map, HeapObject** slot,
HeapObject* object) {
- EvacuateObject<object_contents, kObjectAlignment>(map, slot, object,
- object_size);
+ EvacuateObject<object_contents, kObjectAligned>(map, slot, object,
+ object_size);
}
static inline void Visit(Map* map, HeapObject** slot, HeapObject* object) {
int object_size = map->instance_size();
- EvacuateObject<object_contents, kObjectAlignment>(map, slot, object,
- object_size);
+ EvacuateObject<object_contents, kObjectAligned>(map, slot, object,
+ object_size);
}
};
@@ -2850,7 +2859,7 @@ AllocationResult Heap::AllocateHeapNumber(double value, MutableMode mode,
HeapObject* result;
{
AllocationResult allocation =
- AllocateRaw(size, space, OLD_SPACE, kDoubleUnaligned);
+ AllocateRaw(size, space, OLD_SPACE, kDoubleValueAligned);
if (!allocation.To(&result)) return allocation;
}
« src/globals.h ('K') | « src/heap/heap.h ('k') | src/heap/spaces.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698