| Index: src/arm/assembler-arm.cc
|
| diff --git a/src/arm/assembler-arm.cc b/src/arm/assembler-arm.cc
|
| index d95946e9647bc3938c4a20322b76eb760a75cc78..ba0dc4b81d87b8a731a92a613bdfd5644b0d12fa 100644
|
| --- a/src/arm/assembler-arm.cc
|
| +++ b/src/arm/assembler-arm.cc
|
| @@ -2373,15 +2373,16 @@ void Assembler::vmov(const DwVfpRegister dst,
|
|
|
| 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(dst.low(), ip);
|
| + 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(dst.high(), ip);
|
| + vmov(loc.high(), ip);
|
| } else {
|
| // D16-D31 does not have S registers, so move the low and high parts
|
| // directly to the D register using vmov.32.
|
| @@ -2446,6 +2447,22 @@ void Assembler::vmov(const DwVfpRegister dst,
|
| }
|
|
|
|
|
| +void Assembler::vmov(const Register dst,
|
| + const VmovIndex index,
|
| + const DwVfpRegister src,
|
| + const Condition cond) {
|
| + // Dd[index] = Rt
|
| + // Instruction details available in ARM DDI 0406C.b, A8.8.342.
|
| + // cond(31-28) | 1110(27-24) | U=0(23) | opc1=0index(22-21) | 1(20) |
|
| + // Vn(19-16) | Rt(15-12) | 1011(11-8) | N(7) | opc2=00(6-5) | 1(4) | 0000(3-0)
|
| + ASSERT(index.index == 0 || index.index == 1);
|
| + int vn, n;
|
| + src.split_code(&vn, &n);
|
| + emit(cond | 0xE*B24 | index.index*B21 | B20 | vn*B16 | dst.code()*B12 |
|
| + 0xB*B8 | n*B7 | B4);
|
| +}
|
| +
|
| +
|
| void Assembler::vmov(const DwVfpRegister dst,
|
| const Register src1,
|
| const Register src2,
|
|
|