[HEAP] Remove SIMD 128 bit alignment from heap.
LOG=N BUG=v8:4124, v8:5948 Review-Url: https://codereview.chromium.org/2694063005 Cr-Commit-Position: refs/heads/master@{#43219}
This commit is contained in:
parent
67d087d577
commit
717c8f2c76
@ -370,10 +370,6 @@ const intptr_t kPointerAlignmentMask = kPointerAlignment - 1;
|
||||
const intptr_t kDoubleAlignment = 8;
|
||||
const intptr_t kDoubleAlignmentMask = kDoubleAlignment - 1;
|
||||
|
||||
// Desired alignment for 128 bit SIMD values.
|
||||
const intptr_t kSimd128Alignment = 16;
|
||||
const intptr_t kSimd128AlignmentMask = kSimd128Alignment - 1;
|
||||
|
||||
// Desired alignment for generated code is 32 bytes (to improve cache line
|
||||
// utilization).
|
||||
const int kCodeAlignmentBits = 5;
|
||||
@ -516,12 +512,7 @@ enum AllocationSpace {
|
||||
const int kSpaceTagSize = 3;
|
||||
const int kSpaceTagMask = (1 << kSpaceTagSize) - 1;
|
||||
|
||||
enum AllocationAlignment {
|
||||
kWordAligned,
|
||||
kDoubleAligned,
|
||||
kDoubleUnaligned,
|
||||
kSimd128Unaligned
|
||||
};
|
||||
enum AllocationAlignment { kWordAligned, kDoubleAligned, kDoubleUnaligned };
|
||||
|
||||
// Possible outcomes for decisions.
|
||||
enum class Decision : uint8_t { kUnknown, kTrue, kFalse };
|
||||
|
@ -1970,8 +1970,6 @@ int Heap::GetMaximumFillToAlign(AllocationAlignment alignment) {
|
||||
case kDoubleAligned:
|
||||
case kDoubleUnaligned:
|
||||
return kDoubleSize - kPointerSize;
|
||||
case kSimd128Unaligned:
|
||||
return kSimd128Size - kPointerSize;
|
||||
default:
|
||||
UNREACHABLE();
|
||||
}
|
||||
@ -1985,10 +1983,6 @@ int Heap::GetFillToAlign(Address address, AllocationAlignment alignment) {
|
||||
return kPointerSize;
|
||||
if (alignment == kDoubleUnaligned && (offset & kDoubleAlignmentMask) == 0)
|
||||
return kDoubleSize - kPointerSize; // No fill if double is always aligned.
|
||||
if (alignment == kSimd128Unaligned) {
|
||||
return (kSimd128Size - (static_cast<int>(offset) + kPointerSize)) &
|
||||
kSimd128AlignmentMask;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -84,7 +84,7 @@ class Deserializer : public SerializerDeserializer {
|
||||
DCHECK_EQ(kWordAligned, next_alignment_);
|
||||
int alignment = data - (kAlignmentPrefix - 1);
|
||||
DCHECK_LE(kWordAligned, alignment);
|
||||
DCHECK_LE(alignment, kSimd128Unaligned);
|
||||
DCHECK_LE(alignment, kDoubleUnaligned);
|
||||
next_alignment_ = static_cast<AllocationAlignment>(alignment);
|
||||
}
|
||||
|
||||
|
@ -1869,16 +1869,12 @@ HEAP_TEST(TestSizeOfObjects) {
|
||||
TEST(TestAlignmentCalculations) {
|
||||
// Maximum fill amounts are consistent.
|
||||
int maximum_double_misalignment = kDoubleSize - kPointerSize;
|
||||
int maximum_simd128_misalignment = kSimd128Size - kPointerSize;
|
||||
int max_word_fill = Heap::GetMaximumFillToAlign(kWordAligned);
|
||||
CHECK_EQ(0, max_word_fill);
|
||||
int max_double_fill = Heap::GetMaximumFillToAlign(kDoubleAligned);
|
||||
CHECK_EQ(maximum_double_misalignment, max_double_fill);
|
||||
int max_double_unaligned_fill = Heap::GetMaximumFillToAlign(kDoubleUnaligned);
|
||||
CHECK_EQ(maximum_double_misalignment, max_double_unaligned_fill);
|
||||
int max_simd128_unaligned_fill =
|
||||
Heap::GetMaximumFillToAlign(kSimd128Unaligned);
|
||||
CHECK_EQ(maximum_simd128_misalignment, max_simd128_unaligned_fill);
|
||||
|
||||
Address base = static_cast<Address>(NULL);
|
||||
int fill = 0;
|
||||
@ -1900,16 +1896,6 @@ TEST(TestAlignmentCalculations) {
|
||||
CHECK_EQ(maximum_double_misalignment, fill);
|
||||
fill = Heap::GetFillToAlign(base + kPointerSize, kDoubleUnaligned);
|
||||
CHECK_EQ(0, fill);
|
||||
|
||||
// 128 bit SIMD types have 2 or 4 possible alignments, depending on platform.
|
||||
fill = Heap::GetFillToAlign(base, kSimd128Unaligned);
|
||||
CHECK_EQ((3 * kPointerSize) & kSimd128AlignmentMask, fill);
|
||||
fill = Heap::GetFillToAlign(base + kPointerSize, kSimd128Unaligned);
|
||||
CHECK_EQ((2 * kPointerSize) & kSimd128AlignmentMask, fill);
|
||||
fill = Heap::GetFillToAlign(base + 2 * kPointerSize, kSimd128Unaligned);
|
||||
CHECK_EQ(kPointerSize, fill);
|
||||
fill = Heap::GetFillToAlign(base + 3 * kPointerSize, kSimd128Unaligned);
|
||||
CHECK_EQ(0, fill);
|
||||
}
|
||||
|
||||
|
||||
@ -1977,42 +1963,6 @@ TEST(TestAlignedAllocation) {
|
||||
filler->Size() == kPointerSize);
|
||||
CHECK_EQ(kPointerSize + double_misalignment, *top_addr - start);
|
||||
}
|
||||
|
||||
// Now test SIMD alignment. There are 2 or 4 possible alignments, depending
|
||||
// on platform.
|
||||
start = AlignNewSpace(kSimd128Unaligned, 0);
|
||||
obj = NewSpaceAllocateAligned(kPointerSize, kSimd128Unaligned);
|
||||
CHECK(IsAddressAligned(obj->address(), kSimd128Alignment, kPointerSize));
|
||||
// There is no filler.
|
||||
CHECK_EQ(kPointerSize, *top_addr - start);
|
||||
start = AlignNewSpace(kSimd128Unaligned, kPointerSize);
|
||||
obj = NewSpaceAllocateAligned(kPointerSize, kSimd128Unaligned);
|
||||
CHECK(IsAddressAligned(obj->address(), kSimd128Alignment, kPointerSize));
|
||||
// There is a filler object before the object.
|
||||
filler = HeapObject::FromAddress(start);
|
||||
CHECK(obj != filler && filler->IsFiller() &&
|
||||
filler->Size() == kSimd128Size - kPointerSize);
|
||||
CHECK_EQ(kPointerSize + kSimd128Size - kPointerSize, *top_addr - start);
|
||||
|
||||
if (double_misalignment) {
|
||||
// Test the 2 other alignments possible on 32 bit platforms.
|
||||
start = AlignNewSpace(kSimd128Unaligned, 2 * kPointerSize);
|
||||
obj = NewSpaceAllocateAligned(kPointerSize, kSimd128Unaligned);
|
||||
CHECK(IsAddressAligned(obj->address(), kSimd128Alignment, kPointerSize));
|
||||
// There is a filler object before the object.
|
||||
filler = HeapObject::FromAddress(start);
|
||||
CHECK(obj != filler && filler->IsFiller() &&
|
||||
filler->Size() == 2 * kPointerSize);
|
||||
CHECK_EQ(kPointerSize + 2 * kPointerSize, *top_addr - start);
|
||||
start = AlignNewSpace(kSimd128Unaligned, 3 * kPointerSize);
|
||||
obj = NewSpaceAllocateAligned(kPointerSize, kSimd128Unaligned);
|
||||
CHECK(IsAddressAligned(obj->address(), kSimd128Alignment, kPointerSize));
|
||||
// There is a filler object before the object.
|
||||
filler = HeapObject::FromAddress(start);
|
||||
CHECK(obj != filler && filler->IsFiller() &&
|
||||
filler->Size() == kPointerSize);
|
||||
CHECK_EQ(kPointerSize + kPointerSize, *top_addr - start);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -2061,83 +2011,41 @@ TEST(TestAlignedOverAllocation) {
|
||||
const intptr_t double_misalignment = kDoubleSize - kPointerSize;
|
||||
Address start;
|
||||
HeapObject* obj;
|
||||
HeapObject* filler1;
|
||||
HeapObject* filler2;
|
||||
HeapObject* filler;
|
||||
if (double_misalignment) {
|
||||
start = AlignOldSpace(kDoubleAligned, 0);
|
||||
obj = OldSpaceAllocateAligned(kPointerSize, kDoubleAligned);
|
||||
// The object is aligned, and a filler object is created after.
|
||||
CHECK(IsAddressAligned(obj->address(), kDoubleAlignment));
|
||||
filler1 = HeapObject::FromAddress(start + kPointerSize);
|
||||
CHECK(obj != filler1 && filler1->IsFiller() &&
|
||||
filler1->Size() == kPointerSize);
|
||||
filler = HeapObject::FromAddress(start + kPointerSize);
|
||||
CHECK(obj != filler && filler->IsFiller() &&
|
||||
filler->Size() == kPointerSize);
|
||||
// Try the opposite alignment case.
|
||||
start = AlignOldSpace(kDoubleAligned, kPointerSize);
|
||||
obj = OldSpaceAllocateAligned(kPointerSize, kDoubleAligned);
|
||||
CHECK(IsAddressAligned(obj->address(), kDoubleAlignment));
|
||||
filler1 = HeapObject::FromAddress(start);
|
||||
CHECK(obj != filler1);
|
||||
CHECK(filler1->IsFiller());
|
||||
CHECK(filler1->Size() == kPointerSize);
|
||||
CHECK(obj != filler1 && filler1->IsFiller() &&
|
||||
filler1->Size() == kPointerSize);
|
||||
filler = HeapObject::FromAddress(start);
|
||||
CHECK(obj != filler);
|
||||
CHECK(filler->IsFiller());
|
||||
CHECK(filler->Size() == kPointerSize);
|
||||
CHECK(obj != filler && filler->IsFiller() &&
|
||||
filler->Size() == kPointerSize);
|
||||
|
||||
// Similarly for kDoubleUnaligned.
|
||||
start = AlignOldSpace(kDoubleUnaligned, 0);
|
||||
obj = OldSpaceAllocateAligned(kPointerSize, kDoubleUnaligned);
|
||||
// The object is aligned, and a filler object is created after.
|
||||
CHECK(IsAddressAligned(obj->address(), kDoubleAlignment, kPointerSize));
|
||||
filler1 = HeapObject::FromAddress(start + kPointerSize);
|
||||
CHECK(obj != filler1 && filler1->IsFiller() &&
|
||||
filler1->Size() == kPointerSize);
|
||||
filler = HeapObject::FromAddress(start + kPointerSize);
|
||||
CHECK(obj != filler && filler->IsFiller() &&
|
||||
filler->Size() == kPointerSize);
|
||||
// Try the opposite alignment case.
|
||||
start = AlignOldSpace(kDoubleUnaligned, kPointerSize);
|
||||
obj = OldSpaceAllocateAligned(kPointerSize, kDoubleUnaligned);
|
||||
CHECK(IsAddressAligned(obj->address(), kDoubleAlignment, kPointerSize));
|
||||
filler1 = HeapObject::FromAddress(start);
|
||||
CHECK(obj != filler1 && filler1->IsFiller() &&
|
||||
filler1->Size() == kPointerSize);
|
||||
}
|
||||
|
||||
// Now test SIMD alignment. There are 2 or 4 possible alignments, depending
|
||||
// on platform.
|
||||
start = AlignOldSpace(kSimd128Unaligned, 0);
|
||||
obj = OldSpaceAllocateAligned(kPointerSize, kSimd128Unaligned);
|
||||
CHECK(IsAddressAligned(obj->address(), kSimd128Alignment, kPointerSize));
|
||||
// There is a filler object after the object.
|
||||
filler1 = HeapObject::FromAddress(start + kPointerSize);
|
||||
CHECK(obj != filler1 && filler1->IsFiller() &&
|
||||
filler1->Size() == kSimd128Size - kPointerSize);
|
||||
start = AlignOldSpace(kSimd128Unaligned, kPointerSize);
|
||||
obj = OldSpaceAllocateAligned(kPointerSize, kSimd128Unaligned);
|
||||
CHECK(IsAddressAligned(obj->address(), kSimd128Alignment, kPointerSize));
|
||||
// There is a filler object before the object.
|
||||
filler1 = HeapObject::FromAddress(start);
|
||||
CHECK(obj != filler1 && filler1->IsFiller() &&
|
||||
filler1->Size() == kSimd128Size - kPointerSize);
|
||||
|
||||
if (double_misalignment) {
|
||||
// Test the 2 other alignments possible on 32 bit platforms.
|
||||
start = AlignOldSpace(kSimd128Unaligned, 2 * kPointerSize);
|
||||
obj = OldSpaceAllocateAligned(kPointerSize, kSimd128Unaligned);
|
||||
CHECK(IsAddressAligned(obj->address(), kSimd128Alignment, kPointerSize));
|
||||
// There are filler objects before and after the object.
|
||||
filler1 = HeapObject::FromAddress(start);
|
||||
CHECK(obj != filler1 && filler1->IsFiller() &&
|
||||
filler1->Size() == 2 * kPointerSize);
|
||||
filler2 = HeapObject::FromAddress(start + 3 * kPointerSize);
|
||||
CHECK(obj != filler2 && filler2->IsFiller() &&
|
||||
filler2->Size() == kPointerSize);
|
||||
start = AlignOldSpace(kSimd128Unaligned, 3 * kPointerSize);
|
||||
obj = OldSpaceAllocateAligned(kPointerSize, kSimd128Unaligned);
|
||||
CHECK(IsAddressAligned(obj->address(), kSimd128Alignment, kPointerSize));
|
||||
// There are filler objects before and after the object.
|
||||
filler1 = HeapObject::FromAddress(start);
|
||||
CHECK(obj != filler1 && filler1->IsFiller() &&
|
||||
filler1->Size() == kPointerSize);
|
||||
filler2 = HeapObject::FromAddress(start + 2 * kPointerSize);
|
||||
CHECK(obj != filler2 && filler2->IsFiller() &&
|
||||
filler2->Size() == 2 * kPointerSize);
|
||||
filler = HeapObject::FromAddress(start);
|
||||
CHECK(obj != filler && filler->IsFiller() &&
|
||||
filler->Size() == kPointerSize);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user