diff options
Diffstat (limited to 'deps/v8/src/ia32/codegen-ia32.cc')
-rw-r--r-- | deps/v8/src/ia32/codegen-ia32.cc | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/deps/v8/src/ia32/codegen-ia32.cc b/deps/v8/src/ia32/codegen-ia32.cc index ea61910322..cff6454ff1 100644 --- a/deps/v8/src/ia32/codegen-ia32.cc +++ b/deps/v8/src/ia32/codegen-ia32.cc @@ -397,9 +397,25 @@ void ElementsTransitionGenerator::GenerateSmiOnlyToDouble( // Allocate new FixedDoubleArray. // edx: receiver // edi: length of source FixedArray (smi-tagged) - __ lea(esi, Operand(edi, times_4, FixedDoubleArray::kHeaderSize)); + __ lea(esi, Operand(edi, + times_4, + FixedDoubleArray::kHeaderSize + kPointerSize)); __ AllocateInNewSpace(esi, eax, ebx, no_reg, &gc_required, TAG_OBJECT); + Label aligned, aligned_done; + __ test(eax, Immediate(kDoubleAlignmentMask - kHeapObjectTag)); + __ j(zero, &aligned, Label::kNear); + __ mov(FieldOperand(eax, 0), + Immediate(masm->isolate()->factory()->one_pointer_filler_map())); + __ add(eax, Immediate(kPointerSize)); + __ jmp(&aligned_done); + + __ bind(&aligned); + __ mov(Operand(eax, esi, times_1, -kPointerSize-1), + Immediate(masm->isolate()->factory()->one_pointer_filler_map())); + + __ bind(&aligned_done); + // eax: destination FixedDoubleArray // edi: number of elements // edx: receiver |