| Index: src/heap/heap.cc | 
| diff --git a/src/heap/heap.cc b/src/heap/heap.cc | 
| index 2ba75d0f27c6b40eeaec90ca3c2e25c2f0a95cb1..1ccdf3b4a51f7d88e7b0f0a3303ebb06b95fe64e 100644 | 
| --- a/src/heap/heap.cc | 
| +++ b/src/heap/heap.cc | 
| @@ -1965,10 +1965,20 @@ STATIC_ASSERT((ConstantPoolArray::kExtendedFirstOffset & | 
| kDoubleAlignmentMask) == 0);  // NOLINT | 
| STATIC_ASSERT((FixedTypedArrayBase::kDataOffset & kDoubleAlignmentMask) == | 
| 0);  // NOLINT | 
| +#ifdef V8_HOST_ARCH_32_BIT | 
| +STATIC_ASSERT((HeapNumber::kValueOffset & kDoubleAlignmentMask) != | 
| +              0);  // NOLINT | 
| +#endif | 
|  | 
|  | 
| -HeapObject* Heap::EnsureDoubleAligned(HeapObject* object, int size) { | 
| -  if ((OffsetFrom(object->address()) & kDoubleAlignmentMask) != 0) { | 
| +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 { | 
| @@ -1978,8 +1988,14 @@ HeapObject* Heap::EnsureDoubleAligned(HeapObject* object, int size) { | 
| } | 
|  | 
|  | 
| +HeapObject* Heap::PrecedeWithFiller(HeapObject* object) { | 
| +  CreateFillerObjectAt(object->address(), kPointerSize); | 
| +  return HeapObject::FromAddress(object->address() + kPointerSize); | 
| +} | 
| + | 
| + | 
| HeapObject* Heap::DoubleAlignForDeserialization(HeapObject* object, int size) { | 
| -  return EnsureDoubleAligned(object, size); | 
| +  return EnsureAligned(object, size, kDoubleAligned); | 
| } | 
|  | 
|  | 
| @@ -2131,9 +2147,10 @@ class ScavengingVisitor : public StaticVisitorBase { | 
|  | 
| DCHECK(heap->AllowedToBeMigrated(object, NEW_SPACE)); | 
| AllocationResult allocation; | 
| -#ifndef V8_HOST_ARCH_64_BIT | 
| +#ifdef V8_HOST_ARCH_32_BIT | 
| if (alignment == kDoubleAlignment) { | 
| -      allocation = heap->new_space()->AllocateRawDoubleAligned(object_size); | 
| +      allocation = | 
| +          heap->new_space()->AllocateRawAligned(object_size, kDoubleAligned); | 
| } else { | 
| allocation = heap->new_space()->AllocateRaw(object_size); | 
| } | 
| @@ -2167,9 +2184,10 @@ class ScavengingVisitor : public StaticVisitorBase { | 
| Heap* heap = map->GetHeap(); | 
|  | 
| AllocationResult allocation; | 
| -#ifndef V8_HOST_ARCH_64_BIT | 
| +#ifdef V8_HOST_ARCH_32_BIT | 
| if (alignment == kDoubleAlignment) { | 
| -      allocation = heap->old_space()->AllocateRawDoubleAligned(object_size); | 
| +      allocation = | 
| +          heap->old_space()->AllocateRawAligned(object_size, kDoubleAligned); | 
| } else { | 
| allocation = heap->old_space()->AllocateRaw(object_size); | 
| } | 
| @@ -2840,7 +2858,8 @@ AllocationResult Heap::AllocateHeapNumber(double value, MutableMode mode, | 
|  | 
| HeapObject* result; | 
| { | 
| -    AllocationResult allocation = AllocateRaw(size, space, OLD_SPACE); | 
| +    AllocationResult allocation = | 
| +        AllocateRaw(size, space, OLD_SPACE, kDoubleUnaligned); | 
| if (!allocation.To(&result)) return allocation; | 
| } | 
|  | 
|  |