Index: src/arm/macro-assembler-arm.cc |
diff --git a/src/arm/macro-assembler-arm.cc b/src/arm/macro-assembler-arm.cc |
index c67fad8e1da67bf575bd180add34844a3f9af75f..d7dad5283357044a82731275a7788e385fbda797 100644 |
--- a/src/arm/macro-assembler-arm.cc |
+++ b/src/arm/macro-assembler-arm.cc |
@@ -264,6 +264,45 @@ void MacroAssembler::Move(DwVfpRegister dst, DwVfpRegister src, |
} |
} |
+void MacroAssembler::Move(QwNeonRegister dst, QwNeonRegister src) { |
+ if (dst.is(src)) return; // Moving aliased registers emits nothing. |
+ |
+ if (CpuFeatures::IsSupported(NEON)) { |
+ vmov(dst, src); |
+ } else { |
+ vmov(dst.low(), src.low()); |
+ vmov(dst.high(), src.high()); |
+ } |
+} |
+ |
+void MacroAssembler::Swap(DwVfpRegister srcdst0, DwVfpRegister srcdst1) { |
+ if (srcdst0.is(srcdst1)) return; // Swapping aliased registers emits nothing. |
+ |
+ DCHECK(VfpRegisterIsAvailable(srcdst0)); |
+ DCHECK(VfpRegisterIsAvailable(srcdst1)); |
+ |
+ if (CpuFeatures::IsSupported(NEON)) { |
+ vswp(srcdst0, srcdst1); |
+ } else { |
+ DCHECK(!srcdst0.is(kScratchDoubleReg)); |
+ DCHECK(!srcdst1.is(kScratchDoubleReg)); |
+ vmov(kScratchDoubleReg, srcdst0); |
+ vmov(srcdst0, srcdst1); |
+ vmov(srcdst1, kScratchDoubleReg); |
+ } |
+} |
+ |
+void MacroAssembler::Swap(QwNeonRegister srcdst0, QwNeonRegister srcdst1) { |
+ if (srcdst0.is(srcdst1)) return; // Swapping aliased registers emits nothing. |
+ |
+ if (CpuFeatures::IsSupported(NEON)) { |
+ vswp(srcdst0, srcdst1); |
+ } else { |
+ Swap(srcdst0.low(), srcdst1.low()); |
+ Swap(srcdst0.high(), srcdst1.high()); |
+ } |
+} |
+ |
void MacroAssembler::Mls(Register dst, Register src1, Register src2, |
Register srcA, Condition cond) { |
if (CpuFeatures::IsSupported(ARMv7)) { |