| Index: src/ia32/lithium-codegen-ia32.cc | 
| =================================================================== | 
| --- src/ia32/lithium-codegen-ia32.cc	(revision 6672) | 
| +++ src/ia32/lithium-codegen-ia32.cc	(working copy) | 
| @@ -945,19 +945,31 @@ | 
| if (BitCast<uint64_t, double>(v) == 0) { | 
| __ xorpd(res, res); | 
| } else { | 
| -    int32_t v_int32 = static_cast<int32_t>(v); | 
| -    if (static_cast<double>(v_int32) == v) { | 
| -      __ push_imm32(v_int32); | 
| -      __ cvtsi2sd(res, Operand(esp, 0)); | 
| -      __ add(Operand(esp), Immediate(kPointerSize)); | 
| +    Register temp = ToRegister(instr->TempAt(0)); | 
| +    uint64_t int_val = BitCast<uint64_t, double>(v); | 
| +    int32_t lower = static_cast<int32_t>(int_val); | 
| +    int32_t upper = static_cast<int32_t>(int_val >> (kBitsPerInt)); | 
| +    if (CpuFeatures::IsSupported(SSE4_1)) { | 
| +      CpuFeatures::Scope scope(SSE4_1); | 
| +      if (lower != 0) { | 
| +        __ Set(temp, Immediate(lower)); | 
| +        __ movd(res, Operand(temp)); | 
| +        __ Set(temp, Immediate(upper)); | 
| +        __ pinsrd(res, Operand(temp), 1); | 
| +      } else { | 
| +        __ xorpd(res, res); | 
| +        __ Set(temp, Immediate(upper)); | 
| +        __ pinsrd(res, Operand(temp), 1); | 
| +      } | 
| } else { | 
| -      uint64_t int_val = BitCast<uint64_t, double>(v); | 
| -      int32_t lower = static_cast<int32_t>(int_val); | 
| -      int32_t upper = static_cast<int32_t>(int_val >> (kBitsPerInt)); | 
| -      __ push_imm32(upper); | 
| -      __ push_imm32(lower); | 
| -      __ movdbl(res, Operand(esp, 0)); | 
| -      __ add(Operand(esp), Immediate(2 * kPointerSize)); | 
| +      __ Set(temp, Immediate(upper)); | 
| +      __ movd(res, Operand(temp)); | 
| +      __ psllq(res, 32); | 
| +      if (lower != 0) { | 
| +        __ Set(temp, Immediate(lower)); | 
| +        __ movd(xmm0, Operand(temp)); | 
| +        __ por(res, xmm0); | 
| +      } | 
| } | 
| } | 
| } | 
|  |