| Index: src/mips64/macro-assembler-mips64.cc
|
| diff --git a/src/mips64/macro-assembler-mips64.cc b/src/mips64/macro-assembler-mips64.cc
|
| index 4a2261b868ea5364e91c0101c890ed2ca7bd588b..64b3d552e3167def47cb2772a4e1cf03041bd8e7 100644
|
| --- a/src/mips64/macro-assembler-mips64.cc
|
| +++ b/src/mips64/macro-assembler-mips64.cc
|
| @@ -3865,69 +3865,41 @@ void MacroAssembler::StoreNumberToDoubleElements(Register value_reg,
|
| Register elements_reg,
|
| Register scratch1,
|
| Register scratch2,
|
| - Register scratch3,
|
| Label* fail,
|
| int elements_offset) {
|
| - Label smi_value, maybe_nan, have_double_value, is_nan, done;
|
| - Register mantissa_reg = scratch2;
|
| - Register exponent_reg = scratch3;
|
| + Label smi_value, done;
|
|
|
| // Handle smi values specially.
|
| JumpIfSmi(value_reg, &smi_value);
|
|
|
| - // Ensure that the object is a heap number
|
| + // Ensure that the object is a heap number.
|
| CheckMap(value_reg,
|
| scratch1,
|
| Heap::kHeapNumberMapRootIndex,
|
| fail,
|
| DONT_DO_SMI_CHECK);
|
|
|
| - // Check for nan: all NaN values have a value greater (signed) than 0x7ff00000
|
| - // in the exponent.
|
| - li(scratch1, Operand(kHoleNanUpper32 & HeapNumber::kExponentMask));
|
| - lw(exponent_reg, FieldMemOperand(value_reg, HeapNumber::kExponentOffset));
|
| - Branch(&maybe_nan, ge, exponent_reg, Operand(scratch1));
|
| -
|
| - lwu(mantissa_reg, FieldMemOperand(value_reg, HeapNumber::kMantissaOffset));
|
| -
|
| - bind(&have_double_value);
|
| - // dsll(scratch1, key_reg, kDoubleSizeLog2 - kSmiTagSize);
|
| - dsra(scratch1, key_reg, 32 - kDoubleSizeLog2);
|
| - Daddu(scratch1, scratch1, elements_reg);
|
| - sw(mantissa_reg, FieldMemOperand(
|
| - scratch1, FixedDoubleArray::kHeaderSize - elements_offset));
|
| - uint32_t offset = FixedDoubleArray::kHeaderSize - elements_offset +
|
| - sizeof(kHoleNanLower32);
|
| - sw(exponent_reg, FieldMemOperand(scratch1, offset));
|
| - jmp(&done);
|
| -
|
| - bind(&maybe_nan);
|
| - // Could be NaN, Infinity or -Infinity. If fraction is not zero, it's NaN,
|
| - // otherwise it's Infinity or -Infinity, and the non-NaN code path applies.
|
| - lw(mantissa_reg, FieldMemOperand(value_reg, HeapNumber::kMantissaOffset));
|
| - Branch(&have_double_value, eq, mantissa_reg, Operand(zero_reg));
|
| - bind(&is_nan);
|
| - // Load canonical NaN for storing into the double array.
|
| - LoadRoot(at, Heap::kNanValueRootIndex);
|
| - lw(mantissa_reg, FieldMemOperand(at, HeapNumber::kMantissaOffset));
|
| - lw(exponent_reg, FieldMemOperand(at, HeapNumber::kExponentOffset));
|
| - jmp(&have_double_value);
|
| + // Double value, turn potential sNaN into qNan.
|
| + DoubleRegister double_result = f0;
|
| + DoubleRegister double_scratch = f2;
|
| +
|
| + ldc1(double_result, FieldMemOperand(value_reg, HeapNumber::kValueOffset));
|
| + FPUCanonicalizeNaN(double_result, double_result);
|
| + Branch(&done);
|
|
|
| bind(&smi_value);
|
| + // scratch1 is now effective address of the double element.
|
| + // Untag and transfer.
|
| + mthc1(value_reg, double_scratch);
|
| + cvt_d_w(double_result, double_scratch);
|
| +
|
| + bind(&done);
|
| Daddu(scratch1, elements_reg,
|
| Operand(FixedDoubleArray::kHeaderSize - kHeapObjectTag -
|
| elements_offset));
|
| - // dsll(scratch2, key_reg, kDoubleSizeLog2 - kSmiTagSize);
|
| dsra(scratch2, key_reg, 32 - kDoubleSizeLog2);
|
| Daddu(scratch1, scratch1, scratch2);
|
| - // scratch1 is now effective address of the double element
|
| -
|
| - Register untagged_value = elements_reg;
|
| - SmiUntag(untagged_value, value_reg);
|
| - mtc1(untagged_value, f2);
|
| - cvt_d_w(f0, f2);
|
| - sdc1(f0, MemOperand(scratch1, 0));
|
| - bind(&done);
|
| + sdc1(double_result, MemOperand(scratch1, 0));
|
| }
|
|
|
|
|
| @@ -3999,6 +3971,10 @@ void MacroAssembler::GetWeakValue(Register value, Handle<WeakCell> cell) {
|
| ld(value, FieldMemOperand(value, WeakCell::kValueOffset));
|
| }
|
|
|
| +void MacroAssembler::FPUCanonicalizeNaN(const DoubleRegister dst,
|
| + const DoubleRegister src) {
|
| + sub_d(dst, src, kDoubleRegZero);
|
| +}
|
|
|
| void MacroAssembler::LoadWeakValue(Register value, Handle<WeakCell> cell,
|
| Label* miss) {
|
|
|