Chromium Code Reviews| 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 3da8f320d0b897e4fe66efe6fed9f8d45839384c..cd8442112543099ef2a6c7d1b27d784612005ff7 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)); |
|
rossberg
2013/06/25 10:47:38
Nit: redundant parens
danno
2013/06/28 13:56:05
Done.
|
| + 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(); |
|
rossberg
2013/06/25 10:47:38
Hm, why this?
danno
2013/06/28 13:56:05
This is an artifact of how we use the x87 FP stack
|
| + } |
| + cgen_->PushX87DoubleOperand(MemOperand(esp, 0)); |
| + __ add(esp, Immediate(kDoubleSize)); |
| + } |
| } else { |
| ASSERT(destination->IsStackSlot()); |
| Operand dst = cgen_->ToOperand(destination); |