Index: src/mips/code-stubs-mips.cc |
diff --git a/src/mips/code-stubs-mips.cc b/src/mips/code-stubs-mips.cc |
index ff58c9abd0a0d5b3125818e83492e771f19aeb76..a81b3f3ae1c41ac0c080c9b4b28e7209869b3b1c 100644 |
--- a/src/mips/code-stubs-mips.cc |
+++ b/src/mips/code-stubs-mips.cc |
@@ -807,7 +807,7 @@ void FloatingPointHelper::ConvertIntToDouble(MacroAssembler* masm, |
// Get the number of bits to set in the lower part of the mantissa. |
__ Subu(scratch2, dst_mantissa, |
Operand(HeapNumber::kMantissaBitsInTopWord)); |
- __ Branch(&fewer_than_20_useful_bits, lt, scratch2, Operand(zero_reg)); |
+ __ Branch(&fewer_than_20_useful_bits, le, scratch2, Operand(zero_reg)); |
// Set the higher 20 bits of the mantissa. |
__ srlv(at, int_scratch, scratch2); |
__ or_(dst_exponent, dst_exponent, at); |
@@ -891,8 +891,13 @@ void FloatingPointHelper::LoadNumberAsInt32Double(MacroAssembler* masm, |
// an important value too. |
__ Push(dst_exponent, dst_mantissa); |
} |
- __ lw(dst_exponent, FieldMemOperand(object, HeapNumber::kExponentOffset)); |
- __ lw(dst_mantissa, FieldMemOperand(object, HeapNumber::kMantissaOffset)); |
+ if (object.is(dst_mantissa)) { |
+ __ lw(dst_exponent, FieldMemOperand(object, HeapNumber::kExponentOffset)); |
+ __ lw(dst_mantissa, FieldMemOperand(object, HeapNumber::kMantissaOffset)); |
+ } else { |
+ __ lw(dst_mantissa, FieldMemOperand(object, HeapNumber::kMantissaOffset)); |
+ __ lw(dst_exponent, FieldMemOperand(object, HeapNumber::kExponentOffset)); |
+ } |
// Check for 0 and -0. |
Label zero; |
@@ -910,8 +915,14 @@ void FloatingPointHelper::LoadNumberAsInt32Double(MacroAssembler* masm, |
if (save_registers) { |
__ Pop(dst_exponent, dst_mantissa); |
} |
- __ lw(dst_exponent, FieldMemOperand(object, HeapNumber::kExponentOffset)); |
- __ lw(dst_mantissa, FieldMemOperand(object, HeapNumber::kMantissaOffset)); |
+ if (object.is(dst_mantissa)) { |
+ __ lw(dst_exponent, FieldMemOperand(object, HeapNumber::kExponentOffset)); |
+ __ lw(dst_mantissa, FieldMemOperand(object, HeapNumber::kMantissaOffset)); |
+ } else { |
+ __ lw(dst_mantissa, FieldMemOperand(object, HeapNumber::kMantissaOffset)); |
+ __ lw(dst_exponent, FieldMemOperand(object, HeapNumber::kExponentOffset)); |
+ } |
+ |
__ Branch(&done); |
__ bind(&restore_input_and_miss); |