Index: src/ia32/lithium-gap-resolver-ia32.cc |
diff --git a/src/ia32/lithium-gap-resolver-ia32.cc b/src/ia32/lithium-gap-resolver-ia32.cc |
index 86bfe2fbf28f7279533222ba770a026b0c9f3816..a75ce2152c03823d7c51fab6e5a64808b37b51e1 100644 |
--- a/src/ia32/lithium-gap-resolver-ia32.cc |
+++ b/src/ia32/lithium-gap-resolver-ia32.cc |
@@ -313,6 +313,31 @@ void LGapResolver::EmitMove(int index) { |
} else { |
__ LoadObject(dst, cgen_->ToHandle(constant_source)); |
} |
+ } else if (destination->IsDoubleRegister()) { |
+ double v = cgen_->ToDouble(constant_source); |
+ 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(SSE2)) { |
+ CpuFeatureScope scope(cgen_->masm(), SSE2); |
+ XMMRegister dst = cgen_->ToDoubleRegister(destination); |
+ if (int_val == 0) { |
+ __ xorps(dst, dst); |
+ } else { |
+ __ push(Immediate(upper)); |
+ __ push(Immediate(lower)); |
+ __ movdbl(dst, Operand(esp, 0)); |
+ __ add(esp, Immediate(kDoubleSize)); |
+ } |
+ } else { |
+ __ push(Immediate(upper)); |
+ __ push(Immediate(lower)); |
+ if (cgen_->X87StackNonEmpty()) { |
+ cgen_->PopX87(); |
+ } |
+ cgen_->PushX87DoubleOperand(MemOperand(esp, 0)); |
+ __ add(esp, Immediate(kDoubleSize)); |
+ } |
} else { |
ASSERT(destination->IsStackSlot()); |
Operand dst = cgen_->ToOperand(destination); |