| Index: src/arm/codegen-arm.cc
|
| ===================================================================
|
| --- src/arm/codegen-arm.cc (revision 2133)
|
| +++ src/arm/codegen-arm.cc (working copy)
|
| @@ -4403,14 +4403,21 @@
|
|
|
|
|
| void ConvertToDoubleStub::Generate(MacroAssembler* masm) {
|
| - Label not_special, done;
|
| +#ifndef BIG_ENDIAN_FLOATING_POINT
|
| + Register exponent = result1_;
|
| + Register mantissa = result2_;
|
| +#else
|
| + Register exponent = result2_;
|
| + Register mantissa = result1_;
|
| +#endif
|
| + Label not_special;
|
| // Convert from Smi to integer.
|
| __ mov(source_, Operand(source_, ASR, kSmiTagSize));
|
| // Move sign bit from source to destination. This works because the sign bit
|
| // in the exponent word of the double has the same position and polarity as
|
| // the 2's complement sign bit in a Smi.
|
| ASSERT(HeapNumber::kSignMask == 0x80000000u);
|
| - __ and_(result1_, source_, Operand(HeapNumber::kSignMask), SetCC);
|
| + __ and_(exponent, source_, Operand(HeapNumber::kSignMask), SetCC);
|
| // Subtract from 0 if source was negative.
|
| __ rsb(source_, source_, Operand(0), LeaveCC, ne);
|
| __ cmp(source_, Operand(1));
|
| @@ -4421,32 +4428,31 @@
|
| // For 1 or -1 we need to or in the 0 exponent (biased to 1023).
|
| static const uint32_t exponent_word_for_1 =
|
| HeapNumber::kExponentBias << HeapNumber::kExponentShift;
|
| - __ orr(result1_, result1_, Operand(exponent_word_for_1), LeaveCC, ne);
|
| + __ orr(exponent, exponent, Operand(exponent_word_for_1), LeaveCC, ne);
|
| // 1, 0 and -1 all have 0 for the second word.
|
| - __ mov(result2_, Operand(0));
|
| - __ jmp(&done);
|
| + __ mov(mantissa, Operand(0));
|
| + __ Ret();
|
|
|
| __ bind(¬_special);
|
| // Count leading zeros. Uses result2 for a scratch register on pre-ARM5.
|
| // Gets the wrong answer for 0, but we already checked for that case above.
|
| - CountLeadingZeros(masm, source_, result2_, zeros_);
|
| + CountLeadingZeros(masm, source_, mantissa, zeros_);
|
| // Compute exponent and or it into the exponent register.
|
| // We use result2 as a scratch register here.
|
| - __ rsb(result2_, zeros_, Operand(31 + HeapNumber::kExponentBias));
|
| - __ orr(result1_,
|
| - result1_,
|
| - Operand(result2_, LSL, HeapNumber::kExponentShift));
|
| + __ rsb(mantissa, zeros_, Operand(31 + HeapNumber::kExponentBias));
|
| + __ orr(exponent,
|
| + exponent,
|
| + Operand(mantissa, LSL, HeapNumber::kExponentShift));
|
| // Shift up the source chopping the top bit off.
|
| __ add(zeros_, zeros_, Operand(1));
|
| // This wouldn't work for 1.0 or -1.0 as the shift would be 32 which means 0.
|
| __ mov(source_, Operand(source_, LSL, zeros_));
|
| // Compute lower part of fraction (last 12 bits).
|
| - __ mov(result2_, Operand(source_, LSL, HeapNumber::kMantissaBitsInTopWord));
|
| + __ mov(mantissa, Operand(source_, LSL, HeapNumber::kMantissaBitsInTopWord));
|
| // And the top (top 20 bits).
|
| - __ orr(result1_,
|
| - result1_,
|
| + __ orr(exponent,
|
| + exponent,
|
| Operand(source_, LSR, 32 - HeapNumber::kMantissaBitsInTopWord));
|
| - __ bind(&done);
|
| __ Ret();
|
| }
|
|
|
| @@ -4627,8 +4633,8 @@
|
| __ mov(r5, Operand(r0)); // Overwrite this heap number.
|
| }
|
| // Calling convention says that second double is in r2 and r3.
|
| - __ ldr(r2, FieldMemOperand(r0, HeapNumber::kMantissaOffset));
|
| - __ ldr(r3, FieldMemOperand(r0, HeapNumber::kExponentOffset));
|
| + __ ldr(r2, FieldMemOperand(r0, HeapNumber::kValueOffset));
|
| + __ ldr(r3, FieldMemOperand(r0, HeapNumber::kValueOffset + 4));
|
| __ jmp(&finished_loading_r0);
|
| __ bind(&r0_is_smi);
|
| if (mode == OVERWRITE_RIGHT) {
|
| @@ -4652,8 +4658,8 @@
|
| __ mov(r5, Operand(r1)); // Overwrite this heap number.
|
| }
|
| // Calling convention says that first double is in r0 and r1.
|
| - __ ldr(r0, FieldMemOperand(r1, HeapNumber::kMantissaOffset));
|
| - __ ldr(r1, FieldMemOperand(r1, HeapNumber::kExponentOffset));
|
| + __ ldr(r0, FieldMemOperand(r1, HeapNumber::kValueOffset));
|
| + __ ldr(r1, FieldMemOperand(r1, HeapNumber::kValueOffset + 4));
|
| __ jmp(&finished_loading_r1);
|
| __ bind(&r1_is_smi);
|
| if (mode == OVERWRITE_LEFT) {
|
| @@ -4689,8 +4695,8 @@
|
| __ stc(p1, cr8, MemOperand(r5, HeapNumber::kValueOffset));
|
| #else
|
| // Double returned in registers 0 and 1.
|
| - __ str(r0, FieldMemOperand(r4, HeapNumber::kMantissaOffset));
|
| - __ str(r1, FieldMemOperand(r4, HeapNumber::kExponentOffset));
|
| + __ str(r0, FieldMemOperand(r4, HeapNumber::kValueOffset));
|
| + __ str(r1, FieldMemOperand(r4, HeapNumber::kValueOffset + 4));
|
| #endif
|
| __ mov(r0, Operand(r4));
|
| // And we are done.
|
|
|