From: Stam Markianos-Wright Date: Tue, 4 Apr 2023 12:06:41 +0000 (+0100) Subject: arm: Fix vcreate definition X-Git-Tag: basepoints/gcc-14~207 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3f0ca7a3e4431534bff3b8eb73709cc822e489b0;p=thirdparty%2Fgcc.git arm: Fix vcreate definition 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_): Swap operands. (mve_vcreateq_f): 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. --- diff --git a/gcc/config/arm/mve.md b/gcc/config/arm/mve.md index 369a58d9b75d..35eab6c94bfc 100644 --- a/gcc/config/arm/mve.md +++ b/gcc/config/arm/mve.md @@ -723,7 +723,7 @@ 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")]) @@ -738,7 +738,7 @@ 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")]) diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/vcreateq_f16.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vcreateq_f16.c index 0458bb1bb7cd..8d6764d89383 100644 --- a/gcc/testsuite/gcc.target/arm/mve/intrinsics/vcreateq_f16.c +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vcreateq_f16.c @@ -12,8 +12,8 @@ extern "C" { /* **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 @@ -39,4 +39,4 @@ foo1 () } #endif -/* { dg-final { scan-assembler-not "__ARM_undef" } } */ \ No newline at end of file +/* { dg-final { scan-assembler-not "__ARM_undef" } } */ diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/vcreateq_f32.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vcreateq_f32.c index af782b5ac537..6ab05ced809e 100644 --- a/gcc/testsuite/gcc.target/arm/mve/intrinsics/vcreateq_f32.c +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vcreateq_f32.c @@ -12,8 +12,8 @@ extern "C" { /* **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 @@ -39,4 +39,4 @@ foo1 () } #endif -/* { dg-final { scan-assembler-not "__ARM_undef" } } */ \ No newline at end of file +/* { dg-final { scan-assembler-not "__ARM_undef" } } */ diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/vcreateq_s16.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vcreateq_s16.c index 8a3e91843f8c..290637595a4a 100644 --- a/gcc/testsuite/gcc.target/arm/mve/intrinsics/vcreateq_s16.c +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vcreateq_s16.c @@ -12,8 +12,8 @@ extern "C" { /* **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 @@ -39,4 +39,4 @@ foo1 () } #endif -/* { dg-final { scan-assembler-not "__ARM_undef" } } */ \ No newline at end of file +/* { dg-final { scan-assembler-not "__ARM_undef" } } */ diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/vcreateq_s32.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vcreateq_s32.c index 5e385dfeee0a..4aeead1175ea 100644 --- a/gcc/testsuite/gcc.target/arm/mve/intrinsics/vcreateq_s32.c +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vcreateq_s32.c @@ -12,8 +12,8 @@ extern "C" { /* **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 @@ -39,4 +39,4 @@ foo1 () } #endif -/* { dg-final { scan-assembler-not "__ARM_undef" } } */ \ No newline at end of file +/* { dg-final { scan-assembler-not "__ARM_undef" } } */ diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/vcreateq_s64.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vcreateq_s64.c index df901680c2bb..9f6df427a8fb 100644 --- a/gcc/testsuite/gcc.target/arm/mve/intrinsics/vcreateq_s64.c +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vcreateq_s64.c @@ -12,8 +12,8 @@ extern "C" { /* **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 @@ -39,4 +39,4 @@ foo1 () } #endif -/* { dg-final { scan-assembler-not "__ARM_undef" } } */ \ No newline at end of file +/* { dg-final { scan-assembler-not "__ARM_undef" } } */ diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/vcreateq_s8.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vcreateq_s8.c index e853395af0c6..196c147fb650 100644 --- a/gcc/testsuite/gcc.target/arm/mve/intrinsics/vcreateq_s8.c +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vcreateq_s8.c @@ -12,8 +12,8 @@ extern "C" { /* **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 @@ -39,4 +39,4 @@ foo1 () } #endif -/* { dg-final { scan-assembler-not "__ARM_undef" } } */ \ No newline at end of file +/* { dg-final { scan-assembler-not "__ARM_undef" } } */ diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/vcreateq_u16.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vcreateq_u16.c index bf4a137bb43f..20b18e2ac15f 100644 --- a/gcc/testsuite/gcc.target/arm/mve/intrinsics/vcreateq_u16.c +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vcreateq_u16.c @@ -12,8 +12,8 @@ extern "C" { /* **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 @@ -39,4 +39,4 @@ foo1 () } #endif -/* { dg-final { scan-assembler-not "__ARM_undef" } } */ \ No newline at end of file +/* { dg-final { scan-assembler-not "__ARM_undef" } } */ diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/vcreateq_u32.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vcreateq_u32.c index efb58ddff8bb..febfd3bd7828 100644 --- a/gcc/testsuite/gcc.target/arm/mve/intrinsics/vcreateq_u32.c +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vcreateq_u32.c @@ -12,8 +12,8 @@ extern "C" { /* **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 @@ -39,4 +39,4 @@ foo1 () } #endif -/* { dg-final { scan-assembler-not "__ARM_undef" } } */ \ No newline at end of file +/* { dg-final { scan-assembler-not "__ARM_undef" } } */ diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/vcreateq_u64.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vcreateq_u64.c index 91dd885dce1c..5a49b346bf4f 100644 --- a/gcc/testsuite/gcc.target/arm/mve/intrinsics/vcreateq_u64.c +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vcreateq_u64.c @@ -12,8 +12,8 @@ extern "C" { /* **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 @@ -39,4 +39,4 @@ foo1 () } #endif -/* { dg-final { scan-assembler-not "__ARM_undef" } } */ \ No newline at end of file +/* { dg-final { scan-assembler-not "__ARM_undef" } } */ diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/vcreateq_u8.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vcreateq_u8.c index d5d001158ed8..c0ac5e512254 100644 --- a/gcc/testsuite/gcc.target/arm/mve/intrinsics/vcreateq_u8.c +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/vcreateq_u8.c @@ -12,8 +12,8 @@ extern "C" { /* **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 @@ -39,4 +39,4 @@ foo1 () } #endif -/* { dg-final { scan-assembler-not "__ARM_undef" } } */ \ No newline at end of file +/* { dg-final { scan-assembler-not "__ARM_undef" } } */