| Index: src/arm/assembler-arm.cc
|
| diff --git a/src/arm/assembler-arm.cc b/src/arm/assembler-arm.cc
|
| index 17bf4f93ac7b7a5cf054f7afeadf06b8af3ee245..eae38be6ebb6a2be61f7e35a2be6fc46a91a4071 100644
|
| --- a/src/arm/assembler-arm.cc
|
| +++ b/src/arm/assembler-arm.cc
|
| @@ -2545,27 +2545,20 @@ void Assembler::vmov(const DwVfpRegister dst,
|
| uint32_t lo, hi;
|
| DoubleAsTwoUInt32(imm, &lo, &hi);
|
|
|
| - if (scratch.is(no_reg)) {
|
| - if (dst.code() < 16) {
|
| - const LowDwVfpRegister loc = LowDwVfpRegister::from_code(dst.code());
|
| - // Move the low part of the double into the lower of the corresponsing S
|
| - // registers of D register dst.
|
| - mov(ip, Operand(lo));
|
| - vmov(loc.low(), ip);
|
| -
|
| - // Move the high part of the double into the higher of the
|
| - // corresponsing S registers of D register dst.
|
| - mov(ip, Operand(hi));
|
| - vmov(loc.high(), ip);
|
| + if (lo == hi) {
|
| + // Move the low and high parts of the double to a D register in one
|
| + // instruction.
|
| + mov(ip, Operand(lo));
|
| + vmov(dst, ip, ip);
|
| + } else if (scratch.is(no_reg)) {
|
| + mov(ip, Operand(lo));
|
| + vmov(dst, VmovIndexLo, ip);
|
| + if ((lo & 0xffff) == (hi & 0xffff)) {
|
| + movt(ip, hi >> 16);
|
| } else {
|
| - // D16-D31 does not have S registers, so move the low and high parts
|
| - // directly to the D register using vmov.32.
|
| - // Note: This may be slower, so we only do this when we have to.
|
| - mov(ip, Operand(lo));
|
| - vmov(dst, VmovIndexLo, ip);
|
| mov(ip, Operand(hi));
|
| - vmov(dst, VmovIndexHi, ip);
|
| }
|
| + vmov(dst, VmovIndexHi, ip);
|
| } else {
|
| // Move the low and high parts of the double to a D register in one
|
| // instruction.
|
|
|