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