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 |
} |
} |