| Index: src/arm/macro-assembler-arm.cc | 
| diff --git a/src/arm/macro-assembler-arm.cc b/src/arm/macro-assembler-arm.cc | 
| index 7f05fd6903c0cd7067b862cfad9588cb9f2e9d93..de8e14ef53422d6f45a14119ec1f0b87b768fb48 100644 | 
| --- a/src/arm/macro-assembler-arm.cc | 
| +++ b/src/arm/macro-assembler-arm.cc | 
| @@ -1051,151 +1051,66 @@ | 
| } | 
| } | 
|  | 
| -void MacroAssembler::VmovExtended(int dst_code, int src_code) { | 
| +void MacroAssembler::VmovExtended(Register dst, int src_code) { | 
| +  DCHECK_LE(32, src_code); | 
| +  DCHECK_GT(64, src_code); | 
| +  if (src_code & 0x1) { | 
| +    VmovHigh(dst, DwVfpRegister::from_code(src_code / 2)); | 
| +  } else { | 
| +    VmovLow(dst, DwVfpRegister::from_code(src_code / 2)); | 
| +  } | 
| +} | 
| + | 
| +void MacroAssembler::VmovExtended(int dst_code, Register src) { | 
| +  DCHECK_LE(32, dst_code); | 
| +  DCHECK_GT(64, dst_code); | 
| +  if (dst_code & 0x1) { | 
| +    VmovHigh(DwVfpRegister::from_code(dst_code / 2), src); | 
| +  } else { | 
| +    VmovLow(DwVfpRegister::from_code(dst_code / 2), src); | 
| +  } | 
| +} | 
| + | 
| +void MacroAssembler::VmovExtended(int dst_code, int src_code, | 
| +                                  Register scratch) { | 
| if (src_code < 32 && dst_code < 32) { | 
| // src and dst are both s-registers. | 
| vmov(SwVfpRegister::from_code(dst_code), | 
| SwVfpRegister::from_code(src_code)); | 
| } else if (src_code < 32) { | 
| -    // src is s-register, dst is in high d-register. Move dst into scratch | 
| -    // d-register to do the s-register move, then back. | 
| -    DCHECK_GT(64, dst_code); | 
| -    DwVfpRegister dst_reg = DwVfpRegister::from_code(dst_code / 2); | 
| -    int dst_s_code = kScratchDoubleReg.low().code() + (dst_code & 1); | 
| -    vmov(kScratchDoubleReg, dst_reg); | 
| -    vmov(SwVfpRegister::from_code(dst_s_code), | 
| -         SwVfpRegister::from_code(src_code)); | 
| -    vmov(dst_reg, kScratchDoubleReg); | 
| +    // src is an s-register. | 
| +    vmov(scratch, SwVfpRegister::from_code(src_code)); | 
| +    VmovExtended(dst_code, scratch); | 
| } else if (dst_code < 32) { | 
| -    // src is in high d-register, dst is an s-register. Move src into scratch | 
| -    // d-register, do the s-register move. | 
| -    DCHECK_GT(64, src_code); | 
| -    DwVfpRegister src_reg = DwVfpRegister::from_code(src_code / 2); | 
| -    int src_s_code = kScratchDoubleReg.low().code() + (src_code & 1); | 
| -    vmov(kScratchDoubleReg, src_reg); | 
| -    vmov(SwVfpRegister::from_code(dst_code), | 
| -         SwVfpRegister::from_code(src_s_code)); | 
| -  } else { | 
| -    // src and dst are in high d-registers. Move both into free registers, | 
| -    // do the s-register move, then move dst back. | 
| +    // dst is an s-register. | 
| +    VmovExtended(scratch, src_code); | 
| +    vmov(SwVfpRegister::from_code(dst_code), scratch); | 
| +  } else { | 
| +    // Neither src or dst are s-registers. | 
| DCHECK_GT(64, src_code); | 
| DCHECK_GT(64, dst_code); | 
| -    DwVfpRegister dst_reg = DwVfpRegister::from_code(dst_code / 2); | 
| -    DwVfpRegister src_reg = DwVfpRegister::from_code(src_code / 2); | 
| -    int dst_s_code = kScratchDoubleReg.low().code() + (dst_code & 1); | 
| -    int src_s_code = kDoubleRegZero.low().code() + (src_code & 1); | 
| -    vmov(kScratchDoubleReg, dst_reg); | 
| -    vmov(kDoubleRegZero, src_reg); | 
| -    vmov(SwVfpRegister::from_code(dst_s_code), | 
| -         SwVfpRegister::from_code(src_s_code)); | 
| -    vmov(dst_reg, kScratchDoubleReg); | 
| -    vmov(kDoubleRegZero, 0.0);  // restore zero register | 
| -  } | 
| -} | 
| - | 
| -void MacroAssembler::VmovExtended(int dst_code, const MemOperand& src) { | 
| -  if (dst_code < 32) { | 
| +    VmovExtended(scratch, src_code); | 
| +    VmovExtended(dst_code, scratch); | 
| +  } | 
| +} | 
| + | 
| +void MacroAssembler::VmovExtended(int dst_code, const MemOperand& src, | 
| +                                  Register scratch) { | 
| +  if (dst_code >= 32) { | 
| +    ldr(scratch, src); | 
| +    VmovExtended(dst_code, scratch); | 
| +  } else { | 
| vldr(SwVfpRegister::from_code(dst_code), src); | 
| -  } else { | 
| -    // dst is in high d-register, move it down, load src, then move it back up. | 
| -    DCHECK_GT(64, dst_code); | 
| -    DwVfpRegister dst_reg = DwVfpRegister::from_code(dst_code / 2); | 
| -    int dst_s_code = kScratchDoubleReg.low().code() + (dst_code & 1); | 
| -    vmov(kScratchDoubleReg, dst_reg); | 
| -    vldr(SwVfpRegister::from_code(dst_s_code), src); | 
| -    vmov(dst_reg, kScratchDoubleReg); | 
| -  } | 
| -} | 
| -void MacroAssembler::VmovExtended(const MemOperand& dst, int src_code) { | 
| -  if (src_code < 32) { | 
| +  } | 
| +} | 
| + | 
| +void MacroAssembler::VmovExtended(const MemOperand& dst, int src_code, | 
| +                                  Register scratch) { | 
| +  if (src_code >= 32) { | 
| +    VmovExtended(scratch, src_code); | 
| +    str(scratch, dst); | 
| +  } else { | 
| vstr(SwVfpRegister::from_code(src_code), dst); | 
| -  } else { | 
| -    // src is in high d-register, move it down, store src. | 
| -    DCHECK_GT(64, src_code); | 
| -    DwVfpRegister src_reg = DwVfpRegister::from_code(src_code / 2); | 
| -    int src_s_code = kScratchDoubleReg.low().code() + (src_code & 1); | 
| -    vmov(kScratchDoubleReg, src_reg); | 
| -    vstr(SwVfpRegister::from_code(src_s_code), dst); | 
| -  } | 
| -} | 
| - | 
| -void MacroAssembler::VswpExtended(int dst_code, int src_code) { | 
| -  if (src_code < 32 && dst_code < 32) { | 
| -    // src and dst are both s-registers. | 
| -    vmov(kScratchDoubleReg.low(), SwVfpRegister::from_code(dst_code)); | 
| -    vmov(SwVfpRegister::from_code(dst_code), | 
| -         SwVfpRegister::from_code(src_code)); | 
| -    vmov(SwVfpRegister::from_code(src_code), kScratchDoubleReg.low()); | 
| -  } else if (src_code < 32) { | 
| -    // src is s-register, dst is in high d-register. Move dst into scratch | 
| -    // d-register to do the s-register swap, then back. | 
| -    DCHECK_GT(64, dst_code); | 
| -    DwVfpRegister dst_reg = DwVfpRegister::from_code(dst_code / 2); | 
| -    int dst_s_code = kScratchDoubleReg.low().code() + (dst_code & 1); | 
| -    int dst_s_temp = kDoubleRegZero.low().code() + (dst_code & 1); | 
| -    vmov(kScratchDoubleReg, dst_reg); | 
| -    vmov(kDoubleRegZero, dst_reg); | 
| -    vmov(SwVfpRegister::from_code(dst_s_code), | 
| -         SwVfpRegister::from_code(src_code)); | 
| -    vmov(dst_reg, kScratchDoubleReg); | 
| -    vmov(SwVfpRegister::from_code(src_code), | 
| -         SwVfpRegister::from_code(dst_s_temp)); | 
| -    vmov(kDoubleRegZero, 0.0);  // restore zero register | 
| -  } else if (dst_code < 32) { | 
| -    // src is in high d-register, dst is an s-register. Move src into scratch | 
| -    // d-register, do the s-register swap. | 
| -    DCHECK_GT(64, src_code); | 
| -    DwVfpRegister src_reg = DwVfpRegister::from_code(src_code / 2); | 
| -    int src_s_code = kScratchDoubleReg.low().code() + (src_code & 1); | 
| -    int src_s_temp = kDoubleRegZero.low().code() + (src_code & 1); | 
| -    vmov(kScratchDoubleReg, src_reg); | 
| -    vmov(kDoubleRegZero, src_reg); | 
| -    vmov(SwVfpRegister::from_code(src_s_code), | 
| -         SwVfpRegister::from_code(dst_code)); | 
| -    vmov(src_reg, kScratchDoubleReg); | 
| -    vmov(SwVfpRegister::from_code(dst_code), | 
| -         SwVfpRegister::from_code(src_s_temp)); | 
| -    vmov(kDoubleRegZero, 0.0);  // restore zero register | 
| -  } else { | 
| -    // src and dst are in high d-registers. Move both into free registers, | 
| -    // do the s-register swap, then move both back. | 
| -    DCHECK_GT(64, src_code); | 
| -    DCHECK_GT(64, dst_code); | 
| -    DwVfpRegister dst_reg = DwVfpRegister::from_code(dst_code / 2); | 
| -    DwVfpRegister src_reg = DwVfpRegister::from_code(src_code / 2); | 
| -    int dst_s_code = kScratchDoubleReg.low().code() + (dst_code & 1); | 
| -    int src_s_code = kDoubleRegZero.low().code() + (src_code & 1); | 
| -    vmov(kScratchDoubleReg, dst_reg); | 
| -    vmov(kDoubleRegZero, src_reg); | 
| -    vmov(SwVfpRegister::from_code(src_s_code ^ 1), | 
| -         SwVfpRegister::from_code(dst_s_code)); | 
| -    vmov(SwVfpRegister::from_code(dst_s_code), | 
| -         SwVfpRegister::from_code(src_s_code)); | 
| -    vmov(dst_reg, kScratchDoubleReg); | 
| -    vmov(kScratchDoubleReg, src_reg); | 
| -    vmov(SwVfpRegister::from_code(dst_s_code), | 
| -         SwVfpRegister::from_code(src_s_code ^ 1)); | 
| -    vmov(src_reg, kScratchDoubleReg); | 
| -    vmov(kDoubleRegZero, 0.0);  // restore zero register | 
| -  } | 
| -} | 
| - | 
| -void MacroAssembler::VswpExtended(const MemOperand& dst, int src_code) { | 
| -  if (src_code < 32) { | 
| -    vldr(kScratchDoubleReg.low(), dst); | 
| -    vstr(SwVfpRegister::from_code(src_code), dst); | 
| -    vmov(SwVfpRegister::from_code(src_code), kScratchDoubleReg.low()); | 
| -  } else { | 
| -    // src is in high d-register, move it down, do the swap, move src back up. | 
| -    DCHECK_GT(64, src_code); | 
| -    DwVfpRegister src_reg = DwVfpRegister::from_code(src_code / 2); | 
| -    int src_s_code = kScratchDoubleReg.low().code() + (src_code & 1); | 
| -    vmov(kScratchDoubleReg, src_reg); | 
| -    vldr(kDoubleRegZero.low(), dst); | 
| -    vstr(SwVfpRegister::from_code(src_s_code), dst); | 
| -    vmov(SwVfpRegister::from_code(src_s_code), kDoubleRegZero.low()); | 
| -    vmov(src_reg, kScratchDoubleReg); | 
| -    vmov(kDoubleRegZero, 0.0);  // restore zero register | 
| } | 
| } | 
|  | 
|  |