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) { |