| Index: src/x64/stub-cache-x64.cc
|
| diff --git a/src/x64/stub-cache-x64.cc b/src/x64/stub-cache-x64.cc
|
| index 63d45ef074abb64528893d8c6788aad15238cafd..14ac003747a971d4bf376aa1a35e94d44bb97666 100644
|
| --- a/src/x64/stub-cache-x64.cc
|
| +++ b/src/x64/stub-cache-x64.cc
|
| @@ -3758,8 +3758,7 @@ void KeyedStoreStubCompiler::GenerateStoreFastDoubleElement(
|
| // -- rdx : receiver
|
| // -- rsp[0] : return address
|
| // -----------------------------------
|
| - Label miss_force_generic, smi_value, is_nan, maybe_nan;
|
| - Label have_double_value, not_nan;
|
| + Label miss_force_generic;
|
|
|
| // This stub is meant to be tail-jumped to, the receiver must already
|
| // have been verified by the caller to not be a smi.
|
| @@ -3780,50 +3779,8 @@ void KeyedStoreStubCompiler::GenerateStoreFastDoubleElement(
|
| __ j(above_equal, &miss_force_generic);
|
|
|
| // Handle smi values specially
|
| - __ JumpIfSmi(rax, &smi_value, Label::kNear);
|
| -
|
| - __ CheckMap(rax,
|
| - masm->isolate()->factory()->heap_number_map(),
|
| - &miss_force_generic,
|
| - DONT_DO_SMI_CHECK);
|
| -
|
| - // Double value, canonicalize NaN.
|
| - uint32_t offset = HeapNumber::kValueOffset + sizeof(kHoleNanLower32);
|
| - __ cmpl(FieldOperand(rax, offset),
|
| - Immediate(kNaNOrInfinityLowerBoundUpper32));
|
| - __ j(greater_equal, &maybe_nan, Label::kNear);
|
| -
|
| - __ bind(¬_nan);
|
| - __ movsd(xmm0, FieldOperand(rax, HeapNumber::kValueOffset));
|
| - __ bind(&have_double_value);
|
| - __ SmiToInteger32(rcx, rcx);
|
| - __ movsd(FieldOperand(rdi, rcx, times_8, FixedDoubleArray::kHeaderSize),
|
| - xmm0);
|
| - __ ret(0);
|
| -
|
| - __ bind(&maybe_nan);
|
| - // Could be NaN or Infinity. If fraction is not zero, it's NaN, otherwise
|
| - // it's an Infinity, and the non-NaN code path applies.
|
| - __ j(greater, &is_nan, Label::kNear);
|
| - __ cmpl(FieldOperand(rax, HeapNumber::kValueOffset), Immediate(0));
|
| - __ j(zero, ¬_nan);
|
| - __ bind(&is_nan);
|
| - // Convert all NaNs to the same canonical NaN value when they are stored in
|
| - // the double array.
|
| - __ Set(kScratchRegister, BitCast<uint64_t>(
|
| - FixedDoubleArray::canonical_not_the_hole_nan_as_double()));
|
| - __ movq(xmm0, kScratchRegister);
|
| - __ jmp(&have_double_value, Label::kNear);
|
| -
|
| - __ bind(&smi_value);
|
| - // Value is a smi. convert to a double and store.
|
| - // Preserve original value.
|
| - __ SmiToInteger32(rdx, rax);
|
| - __ push(rdx);
|
| - __ fild_s(Operand(rsp, 0));
|
| - __ pop(rdx);
|
| __ SmiToInteger32(rcx, rcx);
|
| - __ fstp_d(FieldOperand(rdi, rcx, times_8, FixedDoubleArray::kHeaderSize));
|
| + __ StoreNumberToDoubleElements(rax, rdi, rcx, xmm0, &miss_force_generic);
|
| __ ret(0);
|
|
|
| // Handle store cache miss, replacing the ic with the generic stub.
|
|
|