| 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. | 
|  |