| 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);
|
| + }
|
| }
|
| }
|
| }
|
|
|