Index: src/mips/code-stubs-mips.cc |
diff --git a/src/mips/code-stubs-mips.cc b/src/mips/code-stubs-mips.cc |
index aa27f6abe9f9df5f3e7f87b769f2a5af34845e65..a05cee86bb1cf175c9e697672a8a40743c1b1dd3 100644 |
--- a/src/mips/code-stubs-mips.cc |
+++ b/src/mips/code-stubs-mips.cc |
@@ -734,13 +734,13 @@ void FloatingPointHelper::ConvertIntToDouble(MacroAssembler* masm, |
Register int_scratch, |
Destination destination, |
FPURegister double_dst, |
- Register dst1, |
- Register dst2, |
+ Register dst_mantissa, |
+ Register dst_exponent, |
Register scratch2, |
FPURegister single_scratch) { |
ASSERT(!int_scratch.is(scratch2)); |
- ASSERT(!int_scratch.is(dst1)); |
- ASSERT(!int_scratch.is(dst2)); |
+ ASSERT(!int_scratch.is(dst_mantissa)); |
+ ASSERT(!int_scratch.is(dst_exponent)); |
Label done; |
@@ -749,64 +749,65 @@ void FloatingPointHelper::ConvertIntToDouble(MacroAssembler* masm, |
__ mtc1(int_scratch, single_scratch); |
__ cvt_d_w(double_dst, single_scratch); |
if (destination == kCoreRegisters) { |
- __ Move(dst1, dst2, double_dst); |
+ __ Move(dst_mantissa, dst_exponent, double_dst); |
} |
} else { |
Label fewer_than_20_useful_bits; |
// Expected output: |
- // | dst2 | dst1 | |
+ // | dst_exponent | dst_mantissa | |
// | s | exp | mantissa | |
// Check for zero. |
- __ mov(dst2, int_scratch); |
- __ mov(dst1, int_scratch); |
+ __ mov(dst_exponent, int_scratch); |
+ __ mov(dst_mantissa, int_scratch); |
__ Branch(&done, eq, int_scratch, Operand(zero_reg)); |
// Preload the sign of the value. |
- __ And(dst2, int_scratch, Operand(HeapNumber::kSignMask)); |
+ __ And(dst_exponent, int_scratch, Operand(HeapNumber::kSignMask)); |
// Get the absolute value of the object (as an unsigned integer). |
Label skip_sub; |
- __ Branch(&skip_sub, ge, dst2, Operand(zero_reg)); |
+ __ Branch(&skip_sub, ge, dst_exponent, Operand(zero_reg)); |
__ Subu(int_scratch, zero_reg, int_scratch); |
__ bind(&skip_sub); |
// Get mantissa[51:20]. |
// Get the position of the first set bit. |
- __ Clz(dst1, int_scratch); |
+ __ Clz(dst_mantissa, int_scratch); |
__ li(scratch2, 31); |
- __ Subu(dst1, scratch2, dst1); |
+ __ Subu(dst_mantissa, scratch2, dst_mantissa); |
// Set the exponent. |
- __ Addu(scratch2, dst1, Operand(HeapNumber::kExponentBias)); |
- __ Ins(dst2, scratch2, |
+ __ Addu(scratch2, dst_mantissa, Operand(HeapNumber::kExponentBias)); |
+ __ Ins(dst_exponent, scratch2, |
HeapNumber::kExponentShift, HeapNumber::kExponentBits); |
// Clear the first non null bit. |
__ li(scratch2, Operand(1)); |
- __ sllv(scratch2, scratch2, dst1); |
+ __ sllv(scratch2, scratch2, dst_mantissa); |
__ li(at, -1); |
__ Xor(scratch2, scratch2, at); |
__ And(int_scratch, int_scratch, scratch2); |
// Get the number of bits to set in the lower part of the mantissa. |
- __ Subu(scratch2, dst1, Operand(HeapNumber::kMantissaBitsInTopWord)); |
+ __ Subu(scratch2, dst_mantissa, |
+ Operand(HeapNumber::kMantissaBitsInTopWord)); |
__ Branch(&fewer_than_20_useful_bits, lt, scratch2, Operand(zero_reg)); |
// Set the higher 20 bits of the mantissa. |
__ srlv(at, int_scratch, scratch2); |
- __ or_(dst2, dst2, at); |
+ __ or_(dst_exponent, dst_exponent, at); |
__ li(at, 32); |
__ subu(scratch2, at, scratch2); |
- __ sllv(dst1, int_scratch, scratch2); |
+ __ sllv(dst_mantissa, int_scratch, scratch2); |
__ Branch(&done); |
__ bind(&fewer_than_20_useful_bits); |
__ li(at, HeapNumber::kMantissaBitsInTopWord); |
- __ subu(scratch2, at, dst1); |
+ __ subu(scratch2, at, dst_mantissa); |
__ sllv(scratch2, int_scratch, scratch2); |
- __ Or(dst2, dst2, scratch2); |
- // Set dst1 to 0. |
- __ mov(dst1, zero_reg); |
+ __ Or(dst_exponent, dst_exponent, scratch2); |
+ // Set dst_mantissa to 0. |
+ __ mov(dst_mantissa, zero_reg); |
} |
__ bind(&done); |
} |
@@ -817,8 +818,8 @@ void FloatingPointHelper::LoadNumberAsInt32Double(MacroAssembler* masm, |
Destination destination, |
DoubleRegister double_dst, |
DoubleRegister double_scratch, |
- Register dst1, |
- Register dst2, |
+ Register dst_mantissa, |
+ Register dst_exponent, |
Register heap_number_map, |
Register scratch1, |
Register scratch2, |
@@ -834,8 +835,8 @@ void FloatingPointHelper::LoadNumberAsInt32Double(MacroAssembler* masm, |
__ JumpIfNotSmi(object, &obj_is_not_smi); |
__ SmiUntag(scratch1, object); |
- ConvertIntToDouble(masm, scratch1, destination, double_dst, dst1, dst2, |
- scratch2, single_scratch); |
+ ConvertIntToDouble(masm, scratch1, destination, double_dst, dst_mantissa, |
+ dst_exponent, scratch2, single_scratch); |
__ Branch(&done); |
__ bind(&obj_is_not_smi); |
@@ -863,27 +864,51 @@ void FloatingPointHelper::LoadNumberAsInt32Double(MacroAssembler* masm, |
__ Branch(not_int32, ne, except_flag, Operand(zero_reg)); |
if (destination == kCoreRegisters) { |
- __ Move(dst1, dst2, double_dst); |
+ __ Move(dst_mantissa, dst_exponent, double_dst); |
} |
} else { |
ASSERT(!scratch1.is(object) && !scratch2.is(object)); |
// Load the double value in the destination registers. |
- __ lw(dst2, FieldMemOperand(object, HeapNumber::kExponentOffset)); |
- __ lw(dst1, FieldMemOperand(object, HeapNumber::kMantissaOffset)); |
+ bool save_registers = object.is(dst_mantissa) || object.is(dst_exponent); |
+ if (save_registers) { |
+ // Save both output registers, because the other one probably holds |
+ // an important value too. |
+ __ Push(dst_exponent, dst_mantissa); |
+ } |
+ __ lw(dst_exponent, FieldMemOperand(object, HeapNumber::kExponentOffset)); |
+ __ lw(dst_mantissa, FieldMemOperand(object, HeapNumber::kMantissaOffset)); |
// Check for 0 and -0. |
- __ And(scratch1, dst1, Operand(~HeapNumber::kSignMask)); |
- __ Or(scratch1, scratch1, Operand(dst2)); |
- __ Branch(&done, eq, scratch1, Operand(zero_reg)); |
+ Label zero; |
+ __ And(scratch1, dst_exponent, Operand(~HeapNumber::kSignMask)); |
+ __ Or(scratch1, scratch1, Operand(dst_mantissa)); |
+ __ Branch(&zero, eq, scratch1, Operand(zero_reg)); |
// Check that the value can be exactly represented by a 32-bit integer. |
// Jump to not_int32 if that's not the case. |
- DoubleIs32BitInteger(masm, dst1, dst2, scratch1, scratch2, not_int32); |
+ Label restore_input_and_miss; |
+ DoubleIs32BitInteger(masm, dst_exponent, dst_mantissa, scratch1, scratch2, |
+ &restore_input_and_miss); |
+ |
+ // dst_* were trashed. Reload the double value. |
+ if (save_registers) { |
+ __ Pop(dst_exponent, dst_mantissa); |
+ } |
+ __ lw(dst_exponent, FieldMemOperand(object, HeapNumber::kExponentOffset)); |
+ __ lw(dst_mantissa, FieldMemOperand(object, HeapNumber::kMantissaOffset)); |
+ __ Branch(&done); |
- // dst1 and dst2 were trashed. Reload the double value. |
- __ lw(dst2, FieldMemOperand(object, HeapNumber::kExponentOffset)); |
- __ lw(dst1, FieldMemOperand(object, HeapNumber::kMantissaOffset)); |
+ __ bind(&restore_input_and_miss); |
+ if (save_registers) { |
+ __ Pop(dst_exponent, dst_mantissa); |
+ } |
+ __ Branch(not_int32); |
+ |
+ __ bind(&zero); |
+ if (save_registers) { |
+ __ Drop(2); |
+ } |
} |
__ bind(&done); |
@@ -979,14 +1004,14 @@ void FloatingPointHelper::LoadNumberAsInt32(MacroAssembler* masm, |
void FloatingPointHelper::DoubleIs32BitInteger(MacroAssembler* masm, |
- Register src1, |
- Register src2, |
+ Register src_exponent, |
+ Register src_mantissa, |
Register dst, |
Register scratch, |
Label* not_int32) { |
// Get exponent alone in scratch. |
__ Ext(scratch, |
- src1, |
+ src_exponent, |
HeapNumber::kExponentShift, |
HeapNumber::kExponentBits); |
@@ -1006,11 +1031,11 @@ void FloatingPointHelper::DoubleIs32BitInteger(MacroAssembler* masm, |
// Another way to put it is that if (exponent - signbit) > 30 then the |
// number cannot be represented as an int32. |
Register tmp = dst; |
- __ srl(at, src1, 31); |
+ __ srl(at, src_exponent, 31); |
__ subu(tmp, scratch, at); |
__ Branch(not_int32, gt, tmp, Operand(30)); |
// - Bits [21:0] in the mantissa are not null. |
- __ And(tmp, src2, 0x3fffff); |
+ __ And(tmp, src_mantissa, 0x3fffff); |
__ Branch(not_int32, ne, tmp, Operand(zero_reg)); |
// Otherwise the exponent needs to be big enough to shift left all the |
@@ -1021,20 +1046,20 @@ void FloatingPointHelper::DoubleIs32BitInteger(MacroAssembler* masm, |
// Get the 32 higher bits of the mantissa in dst. |
__ Ext(dst, |
- src2, |
+ src_mantissa, |
HeapNumber::kMantissaBitsInTopWord, |
32 - HeapNumber::kMantissaBitsInTopWord); |
- __ sll(at, src1, HeapNumber::kNonMantissaBitsInTopWord); |
+ __ sll(at, src_exponent, HeapNumber::kNonMantissaBitsInTopWord); |
__ or_(dst, dst, at); |
// Create the mask and test the lower bits (of the higher bits). |
__ li(at, 32); |
__ subu(scratch, at, scratch); |
- __ li(src2, 1); |
- __ sllv(src1, src2, scratch); |
- __ Subu(src1, src1, Operand(1)); |
- __ And(src1, dst, src1); |
- __ Branch(not_int32, ne, src1, Operand(zero_reg)); |
+ __ li(src_mantissa, 1); |
+ __ sllv(src_exponent, src_mantissa, scratch); |
+ __ Subu(src_exponent, src_exponent, Operand(1)); |
+ __ And(src_exponent, dst, src_exponent); |
+ __ Branch(not_int32, ne, src_exponent, Operand(zero_reg)); |
} |