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:
parent
48b65f8cd5
commit
5086db3d30
@ -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());
|
||||||
|
Loading…
Reference in New Issue
Block a user