aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/aarch64/macro-assembler-aarch64.h12
-rw-r--r--test/aarch64/test-assembler-aarch64.cc5
-rw-r--r--test/aarch64/test-disasm-aarch64.cc5
3 files changed, 20 insertions, 2 deletions
diff --git a/src/aarch64/macro-assembler-aarch64.h b/src/aarch64/macro-assembler-aarch64.h
index bdd85494..fbab0778 100644
--- a/src/aarch64/macro-assembler-aarch64.h
+++ b/src/aarch64/macro-assembler-aarch64.h
@@ -1518,12 +1518,20 @@ class MacroAssembler : public Assembler, public MacroAssemblerInterface {
void Fmov(const VRegister& vd, int index, const Register& rn) {
VIXL_ASSERT(allow_macro_instructions_);
SingleEmissionCheckScope guard(this);
- fmov(vd, index, rn);
+ if (vd.Is1D() && (index == 0)) {
+ mov(vd, index, rn);
+ } else {
+ fmov(vd, index, rn);
+ }
}
void Fmov(const Register& rd, const VRegister& vn, int index) {
VIXL_ASSERT(allow_macro_instructions_);
SingleEmissionCheckScope guard(this);
- fmov(rd, vn, index);
+ if (vn.Is1D() && (index == 0)) {
+ mov(rd, vn, index);
+ } else {
+ fmov(rd, vn, index);
+ }
}
// Provide explicit double and float interfaces for FP immediate moves, rather
diff --git a/test/aarch64/test-assembler-aarch64.cc b/test/aarch64/test-assembler-aarch64.cc
index 20f4057f..5354d17b 100644
--- a/test/aarch64/test-assembler-aarch64.cc
+++ b/test/aarch64/test-assembler-aarch64.cc
@@ -10782,6 +10782,9 @@ TEST(fmov_reg) {
__ Fmov(d0, 0.0);
__ Fmov(v0.D(), 1, x1);
__ Fmov(x2, v0.D(), 1);
+ __ Fmov(v3.D(), 1, x4);
+ __ Fmov(v3.D(), 0, x1);
+ __ Fmov(x5, v1.D(), 0);
END();
#ifdef VIXL_INCLUDE_SIMULATOR_AARCH64
@@ -10801,6 +10804,8 @@ TEST(fmov_reg) {
ASSERT_EQUAL_FP32(RawbitsToFloat(0x89abcdef), s6);
ASSERT_EQUAL_128(DoubleToRawbits(-13.0), 0x0000000000000000, q0);
ASSERT_EQUAL_64(DoubleToRawbits(-13.0), x2);
+ ASSERT_EQUAL_128(0x0000000000006400, DoubleToRawbits(-13.0), q3);
+ ASSERT_EQUAL_64(DoubleToRawbits(-13.0), x5);
#endif
TEARDOWN();
diff --git a/test/aarch64/test-disasm-aarch64.cc b/test/aarch64/test-disasm-aarch64.cc
index 2dfedfc6..61031829 100644
--- a/test/aarch64/test-disasm-aarch64.cc
+++ b/test/aarch64/test-disasm-aarch64.cc
@@ -6377,6 +6377,11 @@ TEST(neon_modimm) {
COMPARE_MACRO(Fmov(v0.V4H(), Float16(-5.0)), "fmov v0.4h, #0x94 (-5.0000)");
COMPARE_MACRO(Fmov(v31.V8H(), Float16(29.0)), "fmov v31.8h, #0x3d (29.0000)");
+ COMPARE_MACRO(Fmov(v5.D(), 1, x14), "fmov v5.D[1], x14");
+ COMPARE_MACRO(Fmov(x14, v5.D(), 1), "fmov x14, v5.D[1]");
+ COMPARE_MACRO(Fmov(v3.D(), 0, x21), "mov v3.d[0], x21");
+ COMPARE_MACRO(Fmov(x21, v3.D(), 0), "mov x21, v3.d[0]");
+
// An unallocated form of fmov.
COMPARE(dci(0x2f07ffff), "unallocated (Unallocated)");