Fix LGapResolver::EmitMove for X64 when the dst is a double register and src is a constant

R=danno@chromium.org

Review URL: https://codereview.chromium.org/18301015

Patch from Haitao Feng <haitao.feng@intel.com>.

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@15646 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
danno@chromium.org 2013-07-12 12:34:11 +00:00
parent 48b65f8cd5
commit 5086db3d30

View File

@ -205,16 +205,12 @@ void LGapResolver::EmitMove(int index) {
} else if (destination->IsDoubleRegister()) { } else if (destination->IsDoubleRegister()) {
double v = cgen_->ToDouble(constant_source); double v = cgen_->ToDouble(constant_source);
uint64_t int_val = BitCast<uint64_t, double>(v); 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));
XMMRegister dst = cgen_->ToDoubleRegister(destination); XMMRegister dst = cgen_->ToDoubleRegister(destination);
if (int_val == 0) { if (int_val == 0) {
__ xorps(dst, dst); __ xorps(dst, dst);
} else { } else {
__ push(Immediate(upper)); __ movq(kScratchRegister, int_val, RelocInfo::NONE64);
__ push(Immediate(lower)); __ movq(dst, kScratchRegister);
__ movsd(dst, Operand(rsp, 0));
__ addq(rsp, Immediate(kDoubleSize));
} }
} else { } else {
ASSERT(destination->IsStackSlot()); ASSERT(destination->IsStackSlot());