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. |