From the initial merge of the MVE backend, the vcreate
intrinsic has had the vector lanes mixed up, compared
to the intended (as per the ACLE) definition. This is
also a discrepancy with clang:
https://godbolt.org/z/4n93e5aqj
This patches simply switches the operands around and
makes the tests more specific on the input registers
(I do not touch the output Q regs as they vary based
on softfp/hardfp or the input registers when the input
is a constant, since, in that case, a single register
is loaded with a constant and then the same register is
used twice as "vmov q0[2], q0[0], r2, r2" and the reg
num might not always be guaranteed).
gcc/ChangeLog:
* config/arm/mve.md (mve_vcvtq_n_to_f_<supf><mode>): Swap operands.
(mve_vcreateq_f<mode>): Swap operands.
gcc/testsuite/ChangeLog:
* gcc.target/arm/mve/intrinsics/vcreateq_f16.c: Tighten test.
* gcc.target/arm/mve/intrinsics/vcreateq_f32.c: Tighten test.
* gcc.target/arm/mve/intrinsics/vcreateq_s16.c: Tighten test.
* gcc.target/arm/mve/intrinsics/vcreateq_s32.c: Tighten test.
* gcc.target/arm/mve/intrinsics/vcreateq_s64.c: Tighten test.
* gcc.target/arm/mve/intrinsics/vcreateq_s8.c: Tighten test.
* gcc.target/arm/mve/intrinsics/vcreateq_u16.c: Tighten test.
* gcc.target/arm/mve/intrinsics/vcreateq_u32.c: Tighten test.
* gcc.target/arm/mve/intrinsics/vcreateq_u64.c: Tighten test.
* gcc.target/arm/mve/intrinsics/vcreateq_u8.c: Tighten test.
(cherry picked from commit
3f0ca7a3e4431534bff3b8eb73709cc822e489b0)
VCREATEQ_F))
]
"TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
- "vmov %q0[2], %q0[0], %Q2, %Q1\;vmov %q0[3], %q0[1], %R2, %R1"
+ "vmov %q0[2], %q0[0], %Q1, %Q2\;vmov %q0[3], %q0[1], %R1, %R2"
[(set_attr "type" "mve_move")
(set_attr "length""8")])
VCREATEQ))
]
"TARGET_HAVE_MVE"
- "vmov %q0[2], %q0[0], %Q2, %Q1\;vmov %q0[3], %q0[1], %R2, %R1"
+ "vmov %q0[2], %q0[0], %Q1, %Q2\;vmov %q0[3], %q0[1], %R1, %R2"
[(set_attr "type" "mve_move")
(set_attr "length""8")])
/*
**foo:
** ...
-** vmov q[0-9+]\[2\], q[0-9+]\[0\], r[0-9+], r[0-9+]
-** vmov q[0-9+]\[3\], q[0-9+]\[1\], r[0-9+], r[0-9+]
+** vmov q[0-9+]\[2\], q[0-9+]\[0\], r0, r2
+** vmov q[0-9+]\[3\], q[0-9+]\[1\], r1, r3
** ...
*/
float16x8_t
}
#endif
-/* { dg-final { scan-assembler-not "__ARM_undef" } } */
\ No newline at end of file
+/* { dg-final { scan-assembler-not "__ARM_undef" } } */
/*
**foo:
** ...
-** vmov q[0-9+]\[2\], q[0-9+]\[0\], r[0-9+], r[0-9+]
-** vmov q[0-9+]\[3\], q[0-9+]\[1\], r[0-9+], r[0-9+]
+** vmov q[0-9+]\[2\], q[0-9+]\[0\], r0, r2
+** vmov q[0-9+]\[3\], q[0-9+]\[1\], r1, r3
** ...
*/
float32x4_t
}
#endif
-/* { dg-final { scan-assembler-not "__ARM_undef" } } */
\ No newline at end of file
+/* { dg-final { scan-assembler-not "__ARM_undef" } } */
/*
**foo:
** ...
-** vmov q[0-9+]\[2\], q[0-9+]\[0\], r[0-9+], r[0-9+]
-** vmov q[0-9+]\[3\], q[0-9+]\[1\], r[0-9+], r[0-9+]
+** vmov q[0-9+]\[2\], q[0-9+]\[0\], r0, r2
+** vmov q[0-9+]\[3\], q[0-9+]\[1\], r1, r3
** ...
*/
int16x8_t
}
#endif
-/* { dg-final { scan-assembler-not "__ARM_undef" } } */
\ No newline at end of file
+/* { dg-final { scan-assembler-not "__ARM_undef" } } */
/*
**foo:
** ...
-** vmov q[0-9+]\[2\], q[0-9+]\[0\], r[0-9+], r[0-9+]
-** vmov q[0-9+]\[3\], q[0-9+]\[1\], r[0-9+], r[0-9+]
+** vmov q[0-9+]\[2\], q[0-9+]\[0\], r0, r2
+** vmov q[0-9+]\[3\], q[0-9+]\[1\], r1, r3
** ...
*/
int32x4_t
}
#endif
-/* { dg-final { scan-assembler-not "__ARM_undef" } } */
\ No newline at end of file
+/* { dg-final { scan-assembler-not "__ARM_undef" } } */
/*
**foo:
** ...
-** vmov q[0-9+]\[2\], q[0-9+]\[0\], r[0-9+], r[0-9+]
-** vmov q[0-9+]\[3\], q[0-9+]\[1\], r[0-9+], r[0-9+]
+** vmov q[0-9+]\[2\], q[0-9+]\[0\], r0, r2
+** vmov q[0-9+]\[3\], q[0-9+]\[1\], r1, r3
** ...
*/
int64x2_t
}
#endif
-/* { dg-final { scan-assembler-not "__ARM_undef" } } */
\ No newline at end of file
+/* { dg-final { scan-assembler-not "__ARM_undef" } } */
/*
**foo:
** ...
-** vmov q[0-9+]\[2\], q[0-9+]\[0\], r[0-9+], r[0-9+]
-** vmov q[0-9+]\[3\], q[0-9+]\[1\], r[0-9+], r[0-9+]
+** vmov q[0-9+]\[2\], q[0-9+]\[0\], r0, r2
+** vmov q[0-9+]\[3\], q[0-9+]\[1\], r1, r3
** ...
*/
int8x16_t
}
#endif
-/* { dg-final { scan-assembler-not "__ARM_undef" } } */
\ No newline at end of file
+/* { dg-final { scan-assembler-not "__ARM_undef" } } */
/*
**foo:
** ...
-** vmov q[0-9+]\[2\], q[0-9+]\[0\], r[0-9+], r[0-9+]
-** vmov q[0-9+]\[3\], q[0-9+]\[1\], r[0-9+], r[0-9+]
+** vmov q[0-9+]\[2\], q[0-9+]\[0\], r0, r2
+** vmov q[0-9+]\[3\], q[0-9+]\[1\], r1, r3
** ...
*/
uint16x8_t
}
#endif
-/* { dg-final { scan-assembler-not "__ARM_undef" } } */
\ No newline at end of file
+/* { dg-final { scan-assembler-not "__ARM_undef" } } */
/*
**foo:
** ...
-** vmov q[0-9+]\[2\], q[0-9+]\[0\], r[0-9+], r[0-9+]
-** vmov q[0-9+]\[3\], q[0-9+]\[1\], r[0-9+], r[0-9+]
+** vmov q[0-9+]\[2\], q[0-9+]\[0\], r0, r2
+** vmov q[0-9+]\[3\], q[0-9+]\[1\], r1, r3
** ...
*/
uint32x4_t
}
#endif
-/* { dg-final { scan-assembler-not "__ARM_undef" } } */
\ No newline at end of file
+/* { dg-final { scan-assembler-not "__ARM_undef" } } */
/*
**foo:
** ...
-** vmov q[0-9+]\[2\], q[0-9+]\[0\], r[0-9+], r[0-9+]
-** vmov q[0-9+]\[3\], q[0-9+]\[1\], r[0-9+], r[0-9+]
+** vmov q[0-9+]\[2\], q[0-9+]\[0\], r0, r2
+** vmov q[0-9+]\[3\], q[0-9+]\[1\], r1, r3
** ...
*/
uint64x2_t
}
#endif
-/* { dg-final { scan-assembler-not "__ARM_undef" } } */
\ No newline at end of file
+/* { dg-final { scan-assembler-not "__ARM_undef" } } */
/*
**foo:
** ...
-** vmov q[0-9+]\[2\], q[0-9+]\[0\], r[0-9+], r[0-9+]
-** vmov q[0-9+]\[3\], q[0-9+]\[1\], r[0-9+], r[0-9+]
+** vmov q[0-9+]\[2\], q[0-9+]\[0\], r0, r2
+** vmov q[0-9+]\[3\], q[0-9+]\[1\], r1, r3
** ...
*/
uint8x16_t
}
#endif
-/* { dg-final { scan-assembler-not "__ARM_undef" } } */
\ No newline at end of file
+/* { dg-final { scan-assembler-not "__ARM_undef" } } */