> -----Original Message-----
> From: Alfie Richards <[email protected]>
> Sent: 04 November 2025 13:58
> To: [email protected]
> Cc: Richard Earnshaw <[email protected]>; Tamar Christina
> <[email protected]>; [email protected]; Alice Carlotti
> <[email protected]>; Alex Coplan <[email protected]>; Wilco
> Dijkstra <[email protected]>; [email protected]; Alfie
> Richards <[email protected]>
> Subject: [PATCH v1] aarch64: Add support for FEAT_SSVE_BitPerm
>
> Hi All,
>
> Requires my patch updating the AArch64 cli arch options
> (https://gcc.gnu.org/pipermail/gcc-patches/2025-November/699488.html).
>
> Reg tested on AArch64.
>
> Okay for master after prereq lands?
>
> Alfie
>
> -- >8 --
>
> Adds support for the FEAT_SSVE_BitPerm AArch64 extension.
>
> FEAT_SSVE_BitPerm makes the FEAT_SVE2_BitPerm instructions available in
> streaming mode.
>
> gcc/ChangeLog:
>
> * config/aarch64/aarch64-c.cc (aarch64_update_cpp_builtins): Add
> __ARM_FEATURE_SSVE_BITPERM.
> * config/aarch64/aarch64-sve-builtins-sve2.def:
> Make sve-bitperm intrinsics streaming compatible.
> * config/aarch64/aarch64-sve2.md: Change gating of sve-bitperm
> instructions.
> * config/aarch64/aarch64.h (TARGET_SVE_BITPERM): New macro.
> (TARGET_SSVE_BITPERM): New macro.
> (TARGET_STREAMING_SSVE_BITPERM): New macro.
>
> gcc/testsuite/ChangeLog:
>
> * lib/target-supports.exp (exts): Add dg conditions for ssve-bitperm.
> * g++.target/aarch64/sve/aarch64-ssve.exp: Update test for ssve-
> bitperm.
> * gcc.target/aarch64/pragma_cpp_predefs_5.c: Update test.
> * gcc.target/aarch64/sve2/acle/asm/bdep_u16.c: Update for ssve-
> bitperm.
> * gcc.target/aarch64/sve2/acle/asm/bdep_u32.c: Likewise.
> * gcc.target/aarch64/sve2/acle/asm/bdep_u64.c: Likewise.
> * gcc.target/aarch64/sve2/acle/asm/bdep_u8.c: Likewise.
> * gcc.target/aarch64/sve2/acle/asm/bext_u16.c: Likewise.
> * gcc.target/aarch64/sve2/acle/asm/bext_u32.c: Likewise.
> * gcc.target/aarch64/sve2/acle/asm/bext_u64.c: Likewise.
> * gcc.target/aarch64/sve2/acle/asm/bext_u8.c: Likewise.
> * gcc.target/aarch64/sve2/acle/asm/bgrp_u16.c: Likewise.
> * gcc.target/aarch64/sve2/acle/asm/bgrp_u32.c: Likewise.
> * gcc.target/aarch64/sve2/acle/asm/bgrp_u64.c: Likewise.
> * gcc.target/aarch64/sve2/acle/asm/bgrp_u8.c: Likewise.
> * gcc.target/aarch64/sme2/acle-asm/bdep_u16.c: Likewise.
> * gcc.target/aarch64/sme2/acle-asm/bdep_u32.c: Likewise.
> * gcc.target/aarch64/sme2/acle-asm/bdep_u64.c: Likewise.
> * gcc.target/aarch64/sme2/acle-asm/bdep_u8.c: Likewise.
> * gcc.target/aarch64/sme2/acle-asm/bext_u16.c: Likewise.
> * gcc.target/aarch64/sme2/acle-asm/bext_u32.c: Likewise.
> * gcc.target/aarch64/sme2/acle-asm/bext_u64.c: Likewise.
> * gcc.target/aarch64/sme2/acle-asm/bext_u8.c: Likewise.
> * gcc.target/aarch64/sme2/acle-asm/bgrp_u16.c: Likewise.
> * gcc.target/aarch64/sme2/acle-asm/bgrp_u32.c: Likewise.
> * gcc.target/aarch64/sme2/acle-asm/bgrp_u64.c: Likewise.
> * gcc.target/aarch64/sme2/acle-asm/bgrp_u8.c: Likewise.
> ---
> gcc/config/aarch64/aarch64-c.cc | 2 +
> .../aarch64/aarch64-sve-builtins-sve2.def | 3 +-
> gcc/config/aarch64/aarch64-sve2.md | 2 +-
> gcc/config/aarch64/aarch64.h | 16 +++-
> .../g++.target/aarch64/sve/aarch64-ssve.exp | 8 +-
> .../gcc.target/aarch64/pragma_cpp_predefs_5.c | 11 +++
> .../aarch64/sme2/acle-asm/bdep_u16.c | 74 +++++++++++++++++++
> .../aarch64/sme2/acle-asm/bdep_u32.c | 74 +++++++++++++++++++
> .../aarch64/sme2/acle-asm/bdep_u64.c | 74 +++++++++++++++++++
> .../aarch64/sme2/acle-asm/bdep_u8.c | 74 +++++++++++++++++++
> .../aarch64/sme2/acle-asm/bext_u16.c | 74 +++++++++++++++++++
> .../aarch64/sme2/acle-asm/bext_u32.c | 74 +++++++++++++++++++
> .../aarch64/sme2/acle-asm/bext_u64.c | 74 +++++++++++++++++++
> .../aarch64/sme2/acle-asm/bext_u8.c | 74 +++++++++++++++++++
> .../aarch64/sme2/acle-asm/bgrp_u16.c | 74 +++++++++++++++++++
> .../aarch64/sme2/acle-asm/bgrp_u32.c | 74 +++++++++++++++++++
> .../aarch64/sme2/acle-asm/bgrp_u64.c | 74 +++++++++++++++++++
> .../aarch64/sme2/acle-asm/bgrp_u8.c | 74 +++++++++++++++++++
> .../aarch64/sve2/acle/asm/bdep_u16.c | 7 +-
> .../aarch64/sve2/acle/asm/bdep_u32.c | 7 +-
> .../aarch64/sve2/acle/asm/bdep_u64.c | 7 +-
> .../aarch64/sve2/acle/asm/bdep_u8.c | 7 +-
> .../aarch64/sve2/acle/asm/bext_u16.c | 7 +-
> .../aarch64/sve2/acle/asm/bext_u32.c | 7 +-
> .../aarch64/sve2/acle/asm/bext_u64.c | 7 +-
> .../aarch64/sve2/acle/asm/bext_u8.c | 7 +-
> .../aarch64/sve2/acle/asm/bgrp_u16.c | 7 +-
> .../aarch64/sve2/acle/asm/bgrp_u32.c | 7 +-
> .../aarch64/sve2/acle/asm/bgrp_u64.c | 7 +-
> .../aarch64/sve2/acle/asm/bgrp_u8.c | 7 +-
> gcc/testsuite/lib/target-supports.exp | 2 +-
> 31 files changed, 995 insertions(+), 21 deletions(-)
> create mode 100644 gcc/testsuite/gcc.target/aarch64/sme2/acle-
> asm/bdep_u16.c
> create mode 100644 gcc/testsuite/gcc.target/aarch64/sme2/acle-
> asm/bdep_u32.c
> create mode 100644 gcc/testsuite/gcc.target/aarch64/sme2/acle-
> asm/bdep_u64.c
> create mode 100644 gcc/testsuite/gcc.target/aarch64/sme2/acle-
> asm/bdep_u8.c
> create mode 100644 gcc/testsuite/gcc.target/aarch64/sme2/acle-
> asm/bext_u16.c
> create mode 100644 gcc/testsuite/gcc.target/aarch64/sme2/acle-
> asm/bext_u32.c
> create mode 100644 gcc/testsuite/gcc.target/aarch64/sme2/acle-
> asm/bext_u64.c
> create mode 100644 gcc/testsuite/gcc.target/aarch64/sme2/acle-
> asm/bext_u8.c
> create mode 100644 gcc/testsuite/gcc.target/aarch64/sme2/acle-
> asm/bgrp_u16.c
> create mode 100644 gcc/testsuite/gcc.target/aarch64/sme2/acle-
> asm/bgrp_u32.c
> create mode 100644 gcc/testsuite/gcc.target/aarch64/sme2/acle-
> asm/bgrp_u64.c
> create mode 100644 gcc/testsuite/gcc.target/aarch64/sme2/acle-
> asm/bgrp_u8.c
>
> diff --git a/gcc/config/aarch64/aarch64-c.cc b/gcc/config/aarch64/aarch64-
> c.cc
> index c3957c762ef..fd940bdf733 100644
> --- a/gcc/config/aarch64/aarch64-c.cc
> +++ b/gcc/config/aarch64/aarch64-c.cc
> @@ -295,6 +295,8 @@ aarch64_update_cpp_builtins (cpp_reader *pfile)
> aarch64_def_or_undef (AARCH64_HAVE_ISA (SME2p1),
> "__ARM_FEATURE_SME2p1", pfile);
> aarch64_def_or_undef (TARGET_FAMINMAX,
> "__ARM_FEATURE_FAMINMAX", pfile);
> + aarch64_def_or_undef (TARGET_SSVE_BITPERM,
> "__ARM_FEATURE_SSVE_BITPERM",
> + pfile);
>
> // Function multi-versioning defines
> aarch64_def_or_undef (targetm.has_ifunc_p (),
> diff --git a/gcc/config/aarch64/aarch64-sve-builtins-sve2.def
> b/gcc/config/aarch64/aarch64-sve-builtins-sve2.def
> index b622fe33458..6f1601e6f22 100644
> --- a/gcc/config/aarch64/aarch64-sve-builtins-sve2.def
> +++ b/gcc/config/aarch64/aarch64-sve-builtins-sve2.def
> @@ -202,8 +202,7 @@ DEF_SVE_FUNCTION (svpmullb_pair, binary_opt_n,
> d_unsigned, none)
> DEF_SVE_FUNCTION (svpmullt_pair, binary_opt_n, d_unsigned, none)
> #undef REQUIRED_EXTENSIONS
>
> -#define REQUIRED_EXTENSIONS nonstreaming_sve (AARCH64_FL_SVE2 \
> - | AARCH64_FL_SVE2_BITPERM)
> +#define REQUIRED_EXTENSIONS streaming_compatible (AARCH64_FL_SVE2
> | AARCH64_FL_SVE_BITPERM, AARCH64_FL_SSVE_BITPERM)
> DEF_SVE_FUNCTION (svbdep, binary_opt_n, all_unsigned, none)
> DEF_SVE_FUNCTION (svbext, binary_opt_n, all_unsigned, none)
> DEF_SVE_FUNCTION (svbgrp, binary_opt_n, all_unsigned, none)
> diff --git a/gcc/config/aarch64/aarch64-sve2.md
> b/gcc/config/aarch64/aarch64-sve2.md
> index 91091835182..7c86573d364 100644
> --- a/gcc/config/aarch64/aarch64-sve2.md
> +++ b/gcc/config/aarch64/aarch64-sve2.md
> @@ -4191,7 +4191,7 @@ (define_insn
> "@aarch64_sve_<sve_int_op><mode>"
> [(match_operand:SVE_FULL_I 1 "register_operand" "w")
> (match_operand:SVE_FULL_I 2 "register_operand" "w")]
> SVE2_INT_BITPERM))]
> - "TARGET_SVE2_BITPERM"
> + "TARGET_SVE_BITPERM"
> "<sve_int_op>\t%0.<Vetype>, %1.<Vetype>, %2.<Vetype>"
> [(set_attr "sve_type" "sve_int_bit_perm")]
> )
> diff --git a/gcc/config/aarch64/aarch64.h b/gcc/config/aarch64/aarch64.h
> index 47d8fc09925..b15999b5b37 100644
> --- a/gcc/config/aarch64/aarch64.h
> +++ b/gcc/config/aarch64/aarch64.h
> @@ -295,11 +295,25 @@ constexpr auto AARCH64_FL_DEFAULT_ISA_MODE
> ATTRIBUTE_UNUSED
> && AARCH64_HAVE_ISA (SVE_AES) \
> && TARGET_NON_STREAMING)
>
> -/* SVE2 BITPERM instructions, enabled through +sve2-bitperm. */
> +/* SVE BITPERM instructions, enabled through +sve2-bitperm or
> + +ssve-bitperm. */
> +#define TARGET_SVE_BITPERM (AARCH64_HAVE_ISA (SVE_BITPERM))
I find this name to be very confusing (I'm aware the FEAT is FEAT_SVE_)
but It looks like TARGET_SVE2_BITPERM isn't used anywhere else but
the CPP defines.
So how about instead of defining the above..
> +
> +/* Non-streaming support for SVE BITPERM instructions, enabled through
> + +sve2-bitperm. */
> #define TARGET_SVE2_BITPERM (AARCH64_HAVE_ISA (SVE2) \
> && AARCH64_HAVE_ISA (SVE_BITPERM) \
> && TARGET_NON_STREAMING)
>
..drop TARGET_NON_STREAMING from here and change
aarch64_def_or_undef (TARGET_SVE2_BITPERM,
"__ARM_FEATURE_SVE2_BITPERM", pfile);
to
aarch64_def_or_undef (TARGET_SVE2_BITPERM && TARGET_NON_STREAMING,
"__ARM_FEATURE_SVE2_BITPERM", pfile);
So we avoid the really confusing macro name.
> +/* Streaming support for SVE BITPERM instructions, enabled through
> + +ssve-bitperm (which implies SVE2_BITPERM so that all relevant
> instructions
> + are streaming compatible). */
> +#define TARGET_SSVE_BITPERM (AARCH64_HAVE_ISA (SSVE_BITPERM))
> +
> +#define TARGET_STREAMING_SSVE_BITPERM (AARCH64_HAVE_ISA
> (SSVE_BITPERM) \
> + && TARGET_STREAMING)
> +
> +
> /* SVE2 SHA3 instructions, enabled through +sve2-sha3. */
> #define TARGET_SVE2_SHA3 (AARCH64_HAVE_ISA (SVE2) \
> && AARCH64_HAVE_ISA (SVE_SHA3) \
> diff --git a/gcc/testsuite/g++.target/aarch64/sve/aarch64-ssve.exp
> b/gcc/testsuite/g++.target/aarch64/sve/aarch64-ssve.exp
> index 6ba12bc6bbd..6e266330954 100644
> --- a/gcc/testsuite/g++.target/aarch64/sve/aarch64-ssve.exp
> +++ b/gcc/testsuite/g++.target/aarch64/sve/aarch64-ssve.exp
> @@ -37,7 +37,7 @@ gcc_parallel_test_enable 0
> set preamble {
> #include <arm_sve.h>
>
> -#pragma GCC target "+i8mm+f32mm+f64mm+sve2+sve2-bitperm+sve2-
> sm4+sve2-aes+sve2-sha3+sme"
> +#pragma GCC target "+i8mm+f32mm+f64mm+sve2+sve2-bitperm+sve2-
> sm4+sve2-aes+sve2-sha3+sme+ssve-bitperm"
Isn't sve2-bitperm redundant here? Since the docs say:
"When FEAT_SSVE_BitPerm and FEAT_SVE2 is implemented, FEAT_SVE_BitPerm is
implemented."
Ok with those changes if the prereq were accepted.
Thanks,
Tamar
>
> extern svbool_t &pred;
>
> @@ -145,6 +145,9 @@ proc check_ssve_calls { harness calls should_pass } {
> set streaming_ok {
> s8 = svadd_x (pred, s8, s8)
> s8 = svld1 (pred, s8_ptr)
> + u8 = svbdep (u8, u8)
> + u8 = svbext (u8, u8)
> + u8 = svbgrp (u8, u8)
> }
>
> # This order follows the list in the SME manual.
> @@ -161,10 +164,7 @@ set nonstreaming_only {
> u8 = svaese (u8, u8)
> u8 = svaesimc (u8)
> u8 = svaesmc (u8)
> - u8 = svbdep (u8, u8)
> - u8 = svbext (u8, u8)
> f32 = svbfmmla (f32, bf16, bf16)
> - u8 = svbgrp (u8, u8)
> u32 = svcompact (pred, u32)
> f32 = svadda (pred, 1.0f, f32)
> f32 = svexpa (u32)
> diff --git a/gcc/testsuite/gcc.target/aarch64/pragma_cpp_predefs_5.c
> b/gcc/testsuite/gcc.target/aarch64/pragma_cpp_predefs_5.c
> index b15d1c95398..bb83ab434b5 100644
> --- a/gcc/testsuite/gcc.target/aarch64/pragma_cpp_predefs_5.c
> +++ b/gcc/testsuite/gcc.target/aarch64/pragma_cpp_predefs_5.c
> @@ -214,6 +214,17 @@
> #endif
> #pragma GCC pop_options
>
> +#pragma GCC push_options
> +#pragma GCC target "arch=armv8-a+sve2+ssve-bitperm"
> +#ifndef __ARM_FEATURE_SSVE_BITPERM
> +#error Foo
> +#endif
> +
> +#ifndef __ARM_FEATURE_SVE2_BITPERM
> +#error Foo
> +#endif
> +#pragma GCC pop_options
> +
> int
> foo (int a)
> {
> diff --git a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/bdep_u16.c
> b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/bdep_u16.c
> new file mode 100644
> index 00000000000..33f148b3596
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/bdep_u16.c
> @@ -0,0 +1,74 @@
> +/* { dg-do assemble { target aarch64_asm_ssve-bitperm_ok } } */
> +/* { dg-do compile { target { ! aarch64_asm_ssve-bitperm_ok } } } */
> +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
> +
> +#include "test_sme2_acle.h"
> +
> +#pragma GCC target "+sve2+ssve-bitperm"
> +
> +/*
> +** bdep_u16_tied1:
> +** bdep z0\.h, z0\.h, z1\.h
> +** ret
> +*/
> +TEST_UNIFORM_Z (bdep_u16_tied1, svuint16_t,
> + z0 = svbdep_u16 (z0, z1),
> + z0 = svbdep (z0, z1))
> +
> +/*
> +** bdep_u16_tied2:
> +** bdep z0\.h, z1\.h, z0\.h
> +** ret
> +*/
> +TEST_UNIFORM_Z (bdep_u16_tied2, svuint16_t,
> + z0 = svbdep_u16 (z1, z0),
> + z0 = svbdep (z1, z0))
> +
> +/*
> +** bdep_u16_untied:
> +** bdep z0\.h, z1\.h, z2\.h
> +** ret
> +*/
> +TEST_UNIFORM_Z (bdep_u16_untied, svuint16_t,
> + z0 = svbdep_u16 (z1, z2),
> + z0 = svbdep (z1, z2))
> +
> +/*
> +** bdep_w0_u16_tied1:
> +** mov (z[0-9]+\.h), w0
> +** bdep z0\.h, z0\.h, \1
> +** ret
> +*/
> +TEST_UNIFORM_ZX (bdep_w0_u16_tied1, svuint16_t, uint16_t,
> + z0 = svbdep_n_u16 (z0, x0),
> + z0 = svbdep (z0, x0))
> +
> +/*
> +** bdep_w0_u16_untied:
> +** mov (z[0-9]+\.h), w0
> +** bdep z0\.h, z1\.h, \1
> +** ret
> +*/
> +TEST_UNIFORM_ZX (bdep_w0_u16_untied, svuint16_t, uint16_t,
> + z0 = svbdep_n_u16 (z1, x0),
> + z0 = svbdep (z1, x0))
> +
> +/*
> +** bdep_11_u16_tied1:
> +** mov (z[0-9]+\.h), #11
> +** bdep z0\.h, z0\.h, \1
> +** ret
> +*/
> +TEST_UNIFORM_Z (bdep_11_u16_tied1, svuint16_t,
> + z0 = svbdep_n_u16 (z0, 11),
> + z0 = svbdep (z0, 11))
> +
> +/*
> +** bdep_11_u16_untied:
> +** mov (z[0-9]+\.h), #11
> +** bdep z0\.h, z1\.h, \1
> +** ret
> +*/
> +TEST_UNIFORM_Z (bdep_11_u16_untied, svuint16_t,
> + z0 = svbdep_n_u16 (z1, 11),
> + z0 = svbdep (z1, 11))
> diff --git a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/bdep_u32.c
> b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/bdep_u32.c
> new file mode 100644
> index 00000000000..69af58b1da0
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/bdep_u32.c
> @@ -0,0 +1,74 @@
> +/* { dg-do assemble { target aarch64_asm_ssve-bitperm_ok } } */
> +/* { dg-do compile { target { ! aarch64_asm_ssve-bitperm_ok } } } */
> +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
> +
> +#include "test_sme2_acle.h"
> +
> +#pragma GCC target "+sve2+ssve-bitperm"
> +
> +/*
> +** bdep_u32_tied1:
> +** bdep z0\.s, z0\.s, z1\.s
> +** ret
> +*/
> +TEST_UNIFORM_Z (bdep_u32_tied1, svuint32_t,
> + z0 = svbdep_u32 (z0, z1),
> + z0 = svbdep (z0, z1))
> +
> +/*
> +** bdep_u32_tied2:
> +** bdep z0\.s, z1\.s, z0\.s
> +** ret
> +*/
> +TEST_UNIFORM_Z (bdep_u32_tied2, svuint32_t,
> + z0 = svbdep_u32 (z1, z0),
> + z0 = svbdep (z1, z0))
> +
> +/*
> +** bdep_u32_untied:
> +** bdep z0\.s, z1\.s, z2\.s
> +** ret
> +*/
> +TEST_UNIFORM_Z (bdep_u32_untied, svuint32_t,
> + z0 = svbdep_u32 (z1, z2),
> + z0 = svbdep (z1, z2))
> +
> +/*
> +** bdep_w0_u32_tied1:
> +** mov (z[0-9]+\.s), w0
> +** bdep z0\.s, z0\.s, \1
> +** ret
> +*/
> +TEST_UNIFORM_ZX (bdep_w0_u32_tied1, svuint32_t, uint32_t,
> + z0 = svbdep_n_u32 (z0, x0),
> + z0 = svbdep (z0, x0))
> +
> +/*
> +** bdep_w0_u32_untied:
> +** mov (z[0-9]+\.s), w0
> +** bdep z0\.s, z1\.s, \1
> +** ret
> +*/
> +TEST_UNIFORM_ZX (bdep_w0_u32_untied, svuint32_t, uint32_t,
> + z0 = svbdep_n_u32 (z1, x0),
> + z0 = svbdep (z1, x0))
> +
> +/*
> +** bdep_11_u32_tied1:
> +** mov (z[0-9]+\.s), #11
> +** bdep z0\.s, z0\.s, \1
> +** ret
> +*/
> +TEST_UNIFORM_Z (bdep_11_u32_tied1, svuint32_t,
> + z0 = svbdep_n_u32 (z0, 11),
> + z0 = svbdep (z0, 11))
> +
> +/*
> +** bdep_11_u32_untied:
> +** mov (z[0-9]+\.s), #11
> +** bdep z0\.s, z1\.s, \1
> +** ret
> +*/
> +TEST_UNIFORM_Z (bdep_11_u32_untied, svuint32_t,
> + z0 = svbdep_n_u32 (z1, 11),
> + z0 = svbdep (z1, 11))
> diff --git a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/bdep_u64.c
> b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/bdep_u64.c
> new file mode 100644
> index 00000000000..7c2dd848e0f
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/bdep_u64.c
> @@ -0,0 +1,74 @@
> +/* { dg-do assemble { target aarch64_asm_ssve-bitperm_ok } } */
> +/* { dg-do compile { target { ! aarch64_asm_ssve-bitperm_ok } } } */
> +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
> +
> +#include "test_sme2_acle.h"
> +
> +#pragma GCC target "+sve2+ssve-bitperm"
> +
> +/*
> +** bdep_u64_tied1:
> +** bdep z0\.d, z0\.d, z1\.d
> +** ret
> +*/
> +TEST_UNIFORM_Z (bdep_u64_tied1, svuint64_t,
> + z0 = svbdep_u64 (z0, z1),
> + z0 = svbdep (z0, z1))
> +
> +/*
> +** bdep_u64_tied2:
> +** bdep z0\.d, z1\.d, z0\.d
> +** ret
> +*/
> +TEST_UNIFORM_Z (bdep_u64_tied2, svuint64_t,
> + z0 = svbdep_u64 (z1, z0),
> + z0 = svbdep (z1, z0))
> +
> +/*
> +** bdep_u64_untied:
> +** bdep z0\.d, z1\.d, z2\.d
> +** ret
> +*/
> +TEST_UNIFORM_Z (bdep_u64_untied, svuint64_t,
> + z0 = svbdep_u64 (z1, z2),
> + z0 = svbdep (z1, z2))
> +
> +/*
> +** bdep_x0_u64_tied1:
> +** mov (z[0-9]+\.d), x0
> +** bdep z0\.d, z0\.d, \1
> +** ret
> +*/
> +TEST_UNIFORM_ZX (bdep_x0_u64_tied1, svuint64_t, uint64_t,
> + z0 = svbdep_n_u64 (z0, x0),
> + z0 = svbdep (z0, x0))
> +
> +/*
> +** bdep_x0_u64_untied:
> +** mov (z[0-9]+\.d), x0
> +** bdep z0\.d, z1\.d, \1
> +** ret
> +*/
> +TEST_UNIFORM_ZX (bdep_x0_u64_untied, svuint64_t, uint64_t,
> + z0 = svbdep_n_u64 (z1, x0),
> + z0 = svbdep (z1, x0))
> +
> +/*
> +** bdep_11_u64_tied1:
> +** mov (z[0-9]+\.d), #11
> +** bdep z0\.d, z0\.d, \1
> +** ret
> +*/
> +TEST_UNIFORM_Z (bdep_11_u64_tied1, svuint64_t,
> + z0 = svbdep_n_u64 (z0, 11),
> + z0 = svbdep (z0, 11))
> +
> +/*
> +** bdep_11_u64_untied:
> +** mov (z[0-9]+\.d), #11
> +** bdep z0\.d, z1\.d, \1
> +** ret
> +*/
> +TEST_UNIFORM_Z (bdep_11_u64_untied, svuint64_t,
> + z0 = svbdep_n_u64 (z1, 11),
> + z0 = svbdep (z1, 11))
> diff --git a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/bdep_u8.c
> b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/bdep_u8.c
> new file mode 100644
> index 00000000000..e401eb029f9
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/bdep_u8.c
> @@ -0,0 +1,74 @@
> +/* { dg-do assemble { target aarch64_asm_ssve-bitperm_ok } } */
> +/* { dg-do compile { target { ! aarch64_asm_ssve-bitperm_ok } } } */
> +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
> +
> +#include "test_sme2_acle.h"
> +
> +#pragma GCC target "+sve2+ssve-bitperm"
> +
> +/*
> +** bdep_u8_tied1:
> +** bdep z0\.b, z0\.b, z1\.b
> +** ret
> +*/
> +TEST_UNIFORM_Z (bdep_u8_tied1, svuint8_t,
> + z0 = svbdep_u8 (z0, z1),
> + z0 = svbdep (z0, z1))
> +
> +/*
> +** bdep_u8_tied2:
> +** bdep z0\.b, z1\.b, z0\.b
> +** ret
> +*/
> +TEST_UNIFORM_Z (bdep_u8_tied2, svuint8_t,
> + z0 = svbdep_u8 (z1, z0),
> + z0 = svbdep (z1, z0))
> +
> +/*
> +** bdep_u8_untied:
> +** bdep z0\.b, z1\.b, z2\.b
> +** ret
> +*/
> +TEST_UNIFORM_Z (bdep_u8_untied, svuint8_t,
> + z0 = svbdep_u8 (z1, z2),
> + z0 = svbdep (z1, z2))
> +
> +/*
> +** bdep_w0_u8_tied1:
> +** mov (z[0-9]+\.b), w0
> +** bdep z0\.b, z0\.b, \1
> +** ret
> +*/
> +TEST_UNIFORM_ZX (bdep_w0_u8_tied1, svuint8_t, uint8_t,
> + z0 = svbdep_n_u8 (z0, x0),
> + z0 = svbdep (z0, x0))
> +
> +/*
> +** bdep_w0_u8_untied:
> +** mov (z[0-9]+\.b), w0
> +** bdep z0\.b, z1\.b, \1
> +** ret
> +*/
> +TEST_UNIFORM_ZX (bdep_w0_u8_untied, svuint8_t, uint8_t,
> + z0 = svbdep_n_u8 (z1, x0),
> + z0 = svbdep (z1, x0))
> +
> +/*
> +** bdep_11_u8_tied1:
> +** mov (z[0-9]+\.b), #11
> +** bdep z0\.b, z0\.b, \1
> +** ret
> +*/
> +TEST_UNIFORM_Z (bdep_11_u8_tied1, svuint8_t,
> + z0 = svbdep_n_u8 (z0, 11),
> + z0 = svbdep (z0, 11))
> +
> +/*
> +** bdep_11_u8_untied:
> +** mov (z[0-9]+\.b), #11
> +** bdep z0\.b, z1\.b, \1
> +** ret
> +*/
> +TEST_UNIFORM_Z (bdep_11_u8_untied, svuint8_t,
> + z0 = svbdep_n_u8 (z1, 11),
> + z0 = svbdep (z1, 11))
> diff --git a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/bext_u16.c
> b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/bext_u16.c
> new file mode 100644
> index 00000000000..05b4121a428
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/bext_u16.c
> @@ -0,0 +1,74 @@
> +/* { dg-do assemble { target aarch64_asm_ssve-bitperm_ok } } */
> +/* { dg-do compile { target { ! aarch64_asm_ssve-bitperm_ok } } } */
> +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
> +
> +#include "test_sme2_acle.h"
> +
> +#pragma GCC target "+sve2+ssve-bitperm"
> +
> +/*
> +** bext_u16_tied1:
> +** bext z0\.h, z0\.h, z1\.h
> +** ret
> +*/
> +TEST_UNIFORM_Z (bext_u16_tied1, svuint16_t,
> + z0 = svbext_u16 (z0, z1),
> + z0 = svbext (z0, z1))
> +
> +/*
> +** bext_u16_tied2:
> +** bext z0\.h, z1\.h, z0\.h
> +** ret
> +*/
> +TEST_UNIFORM_Z (bext_u16_tied2, svuint16_t,
> + z0 = svbext_u16 (z1, z0),
> + z0 = svbext (z1, z0))
> +
> +/*
> +** bext_u16_untied:
> +** bext z0\.h, z1\.h, z2\.h
> +** ret
> +*/
> +TEST_UNIFORM_Z (bext_u16_untied, svuint16_t,
> + z0 = svbext_u16 (z1, z2),
> + z0 = svbext (z1, z2))
> +
> +/*
> +** bext_w0_u16_tied1:
> +** mov (z[0-9]+\.h), w0
> +** bext z0\.h, z0\.h, \1
> +** ret
> +*/
> +TEST_UNIFORM_ZX (bext_w0_u16_tied1, svuint16_t, uint16_t,
> + z0 = svbext_n_u16 (z0, x0),
> + z0 = svbext (z0, x0))
> +
> +/*
> +** bext_w0_u16_untied:
> +** mov (z[0-9]+\.h), w0
> +** bext z0\.h, z1\.h, \1
> +** ret
> +*/
> +TEST_UNIFORM_ZX (bext_w0_u16_untied, svuint16_t, uint16_t,
> + z0 = svbext_n_u16 (z1, x0),
> + z0 = svbext (z1, x0))
> +
> +/*
> +** bext_11_u16_tied1:
> +** mov (z[0-9]+\.h), #11
> +** bext z0\.h, z0\.h, \1
> +** ret
> +*/
> +TEST_UNIFORM_Z (bext_11_u16_tied1, svuint16_t,
> + z0 = svbext_n_u16 (z0, 11),
> + z0 = svbext (z0, 11))
> +
> +/*
> +** bext_11_u16_untied:
> +** mov (z[0-9]+\.h), #11
> +** bext z0\.h, z1\.h, \1
> +** ret
> +*/
> +TEST_UNIFORM_Z (bext_11_u16_untied, svuint16_t,
> + z0 = svbext_n_u16 (z1, 11),
> + z0 = svbext (z1, 11))
> diff --git a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/bext_u32.c
> b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/bext_u32.c
> new file mode 100644
> index 00000000000..ea340772237
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/bext_u32.c
> @@ -0,0 +1,74 @@
> +/* { dg-do assemble { target aarch64_asm_ssve-bitperm_ok } } */
> +/* { dg-do compile { target { ! aarch64_asm_ssve-bitperm_ok } } } */
> +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
> +
> +#include "test_sme2_acle.h"
> +
> +#pragma GCC target "+sve2+ssve-bitperm"
> +
> +/*
> +** bext_u32_tied1:
> +** bext z0\.s, z0\.s, z1\.s
> +** ret
> +*/
> +TEST_UNIFORM_Z (bext_u32_tied1, svuint32_t,
> + z0 = svbext_u32 (z0, z1),
> + z0 = svbext (z0, z1))
> +
> +/*
> +** bext_u32_tied2:
> +** bext z0\.s, z1\.s, z0\.s
> +** ret
> +*/
> +TEST_UNIFORM_Z (bext_u32_tied2, svuint32_t,
> + z0 = svbext_u32 (z1, z0),
> + z0 = svbext (z1, z0))
> +
> +/*
> +** bext_u32_untied:
> +** bext z0\.s, z1\.s, z2\.s
> +** ret
> +*/
> +TEST_UNIFORM_Z (bext_u32_untied, svuint32_t,
> + z0 = svbext_u32 (z1, z2),
> + z0 = svbext (z1, z2))
> +
> +/*
> +** bext_w0_u32_tied1:
> +** mov (z[0-9]+\.s), w0
> +** bext z0\.s, z0\.s, \1
> +** ret
> +*/
> +TEST_UNIFORM_ZX (bext_w0_u32_tied1, svuint32_t, uint32_t,
> + z0 = svbext_n_u32 (z0, x0),
> + z0 = svbext (z0, x0))
> +
> +/*
> +** bext_w0_u32_untied:
> +** mov (z[0-9]+\.s), w0
> +** bext z0\.s, z1\.s, \1
> +** ret
> +*/
> +TEST_UNIFORM_ZX (bext_w0_u32_untied, svuint32_t, uint32_t,
> + z0 = svbext_n_u32 (z1, x0),
> + z0 = svbext (z1, x0))
> +
> +/*
> +** bext_11_u32_tied1:
> +** mov (z[0-9]+\.s), #11
> +** bext z0\.s, z0\.s, \1
> +** ret
> +*/
> +TEST_UNIFORM_Z (bext_11_u32_tied1, svuint32_t,
> + z0 = svbext_n_u32 (z0, 11),
> + z0 = svbext (z0, 11))
> +
> +/*
> +** bext_11_u32_untied:
> +** mov (z[0-9]+\.s), #11
> +** bext z0\.s, z1\.s, \1
> +** ret
> +*/
> +TEST_UNIFORM_Z (bext_11_u32_untied, svuint32_t,
> + z0 = svbext_n_u32 (z1, 11),
> + z0 = svbext (z1, 11))
> diff --git a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/bext_u64.c
> b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/bext_u64.c
> new file mode 100644
> index 00000000000..379bfb2e2f4
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/bext_u64.c
> @@ -0,0 +1,74 @@
> +/* { dg-do assemble { target aarch64_asm_ssve-bitperm_ok } } */
> +/* { dg-do compile { target { ! aarch64_asm_ssve-bitperm_ok } } } */
> +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
> +
> +#include "test_sme2_acle.h"
> +
> +#pragma GCC target "+sve2+ssve-bitperm"
> +
> +/*
> +** bext_u64_tied1:
> +** bext z0\.d, z0\.d, z1\.d
> +** ret
> +*/
> +TEST_UNIFORM_Z (bext_u64_tied1, svuint64_t,
> + z0 = svbext_u64 (z0, z1),
> + z0 = svbext (z0, z1))
> +
> +/*
> +** bext_u64_tied2:
> +** bext z0\.d, z1\.d, z0\.d
> +** ret
> +*/
> +TEST_UNIFORM_Z (bext_u64_tied2, svuint64_t,
> + z0 = svbext_u64 (z1, z0),
> + z0 = svbext (z1, z0))
> +
> +/*
> +** bext_u64_untied:
> +** bext z0\.d, z1\.d, z2\.d
> +** ret
> +*/
> +TEST_UNIFORM_Z (bext_u64_untied, svuint64_t,
> + z0 = svbext_u64 (z1, z2),
> + z0 = svbext (z1, z2))
> +
> +/*
> +** bext_x0_u64_tied1:
> +** mov (z[0-9]+\.d), x0
> +** bext z0\.d, z0\.d, \1
> +** ret
> +*/
> +TEST_UNIFORM_ZX (bext_x0_u64_tied1, svuint64_t, uint64_t,
> + z0 = svbext_n_u64 (z0, x0),
> + z0 = svbext (z0, x0))
> +
> +/*
> +** bext_x0_u64_untied:
> +** mov (z[0-9]+\.d), x0
> +** bext z0\.d, z1\.d, \1
> +** ret
> +*/
> +TEST_UNIFORM_ZX (bext_x0_u64_untied, svuint64_t, uint64_t,
> + z0 = svbext_n_u64 (z1, x0),
> + z0 = svbext (z1, x0))
> +
> +/*
> +** bext_11_u64_tied1:
> +** mov (z[0-9]+\.d), #11
> +** bext z0\.d, z0\.d, \1
> +** ret
> +*/
> +TEST_UNIFORM_Z (bext_11_u64_tied1, svuint64_t,
> + z0 = svbext_n_u64 (z0, 11),
> + z0 = svbext (z0, 11))
> +
> +/*
> +** bext_11_u64_untied:
> +** mov (z[0-9]+\.d), #11
> +** bext z0\.d, z1\.d, \1
> +** ret
> +*/
> +TEST_UNIFORM_Z (bext_11_u64_untied, svuint64_t,
> + z0 = svbext_n_u64 (z1, 11),
> + z0 = svbext (z1, 11))
> diff --git a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/bext_u8.c
> b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/bext_u8.c
> new file mode 100644
> index 00000000000..210f9f70cdb
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/bext_u8.c
> @@ -0,0 +1,74 @@
> +/* { dg-do assemble { target aarch64_asm_ssve-bitperm_ok } } */
> +/* { dg-do compile { target { ! aarch64_asm_ssve-bitperm_ok } } } */
> +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
> +
> +#include "test_sme2_acle.h"
> +
> +#pragma GCC target "+sve2+ssve-bitperm"
> +
> +/*
> +** bext_u8_tied1:
> +** bext z0\.b, z0\.b, z1\.b
> +** ret
> +*/
> +TEST_UNIFORM_Z (bext_u8_tied1, svuint8_t,
> + z0 = svbext_u8 (z0, z1),
> + z0 = svbext (z0, z1))
> +
> +/*
> +** bext_u8_tied2:
> +** bext z0\.b, z1\.b, z0\.b
> +** ret
> +*/
> +TEST_UNIFORM_Z (bext_u8_tied2, svuint8_t,
> + z0 = svbext_u8 (z1, z0),
> + z0 = svbext (z1, z0))
> +
> +/*
> +** bext_u8_untied:
> +** bext z0\.b, z1\.b, z2\.b
> +** ret
> +*/
> +TEST_UNIFORM_Z (bext_u8_untied, svuint8_t,
> + z0 = svbext_u8 (z1, z2),
> + z0 = svbext (z1, z2))
> +
> +/*
> +** bext_w0_u8_tied1:
> +** mov (z[0-9]+\.b), w0
> +** bext z0\.b, z0\.b, \1
> +** ret
> +*/
> +TEST_UNIFORM_ZX (bext_w0_u8_tied1, svuint8_t, uint8_t,
> + z0 = svbext_n_u8 (z0, x0),
> + z0 = svbext (z0, x0))
> +
> +/*
> +** bext_w0_u8_untied:
> +** mov (z[0-9]+\.b), w0
> +** bext z0\.b, z1\.b, \1
> +** ret
> +*/
> +TEST_UNIFORM_ZX (bext_w0_u8_untied, svuint8_t, uint8_t,
> + z0 = svbext_n_u8 (z1, x0),
> + z0 = svbext (z1, x0))
> +
> +/*
> +** bext_11_u8_tied1:
> +** mov (z[0-9]+\.b), #11
> +** bext z0\.b, z0\.b, \1
> +** ret
> +*/
> +TEST_UNIFORM_Z (bext_11_u8_tied1, svuint8_t,
> + z0 = svbext_n_u8 (z0, 11),
> + z0 = svbext (z0, 11))
> +
> +/*
> +** bext_11_u8_untied:
> +** mov (z[0-9]+\.b), #11
> +** bext z0\.b, z1\.b, \1
> +** ret
> +*/
> +TEST_UNIFORM_Z (bext_11_u8_untied, svuint8_t,
> + z0 = svbext_n_u8 (z1, 11),
> + z0 = svbext (z1, 11))
> diff --git a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/bgrp_u16.c
> b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/bgrp_u16.c
> new file mode 100644
> index 00000000000..7ca93671e16
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/bgrp_u16.c
> @@ -0,0 +1,74 @@
> +/* { dg-do assemble { target aarch64_asm_ssve-bitperm_ok } } */
> +/* { dg-do compile { target { ! aarch64_asm_ssve-bitperm_ok } } } */
> +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
> +
> +#include "test_sme2_acle.h"
> +
> +#pragma GCC target "+sve2+ssve-bitperm"
> +
> +/*
> +** bgrp_u16_tied1:
> +** bgrp z0\.h, z0\.h, z1\.h
> +** ret
> +*/
> +TEST_UNIFORM_Z (bgrp_u16_tied1, svuint16_t,
> + z0 = svbgrp_u16 (z0, z1),
> + z0 = svbgrp (z0, z1))
> +
> +/*
> +** bgrp_u16_tied2:
> +** bgrp z0\.h, z1\.h, z0\.h
> +** ret
> +*/
> +TEST_UNIFORM_Z (bgrp_u16_tied2, svuint16_t,
> + z0 = svbgrp_u16 (z1, z0),
> + z0 = svbgrp (z1, z0))
> +
> +/*
> +** bgrp_u16_untied:
> +** bgrp z0\.h, z1\.h, z2\.h
> +** ret
> +*/
> +TEST_UNIFORM_Z (bgrp_u16_untied, svuint16_t,
> + z0 = svbgrp_u16 (z1, z2),
> + z0 = svbgrp (z1, z2))
> +
> +/*
> +** bgrp_w0_u16_tied1:
> +** mov (z[0-9]+\.h), w0
> +** bgrp z0\.h, z0\.h, \1
> +** ret
> +*/
> +TEST_UNIFORM_ZX (bgrp_w0_u16_tied1, svuint16_t, uint16_t,
> + z0 = svbgrp_n_u16 (z0, x0),
> + z0 = svbgrp (z0, x0))
> +
> +/*
> +** bgrp_w0_u16_untied:
> +** mov (z[0-9]+\.h), w0
> +** bgrp z0\.h, z1\.h, \1
> +** ret
> +*/
> +TEST_UNIFORM_ZX (bgrp_w0_u16_untied, svuint16_t, uint16_t,
> + z0 = svbgrp_n_u16 (z1, x0),
> + z0 = svbgrp (z1, x0))
> +
> +/*
> +** bgrp_11_u16_tied1:
> +** mov (z[0-9]+\.h), #11
> +** bgrp z0\.h, z0\.h, \1
> +** ret
> +*/
> +TEST_UNIFORM_Z (bgrp_11_u16_tied1, svuint16_t,
> + z0 = svbgrp_n_u16 (z0, 11),
> + z0 = svbgrp (z0, 11))
> +
> +/*
> +** bgrp_11_u16_untied:
> +** mov (z[0-9]+\.h), #11
> +** bgrp z0\.h, z1\.h, \1
> +** ret
> +*/
> +TEST_UNIFORM_Z (bgrp_11_u16_untied, svuint16_t,
> + z0 = svbgrp_n_u16 (z1, 11),
> + z0 = svbgrp (z1, 11))
> diff --git a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/bgrp_u32.c
> b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/bgrp_u32.c
> new file mode 100644
> index 00000000000..1b8ccf420fb
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/bgrp_u32.c
> @@ -0,0 +1,74 @@
> +/* { dg-do assemble { target aarch64_asm_ssve-bitperm_ok } } */
> +/* { dg-do compile { target { ! aarch64_asm_ssve-bitperm_ok } } } */
> +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
> +
> +#include "test_sme2_acle.h"
> +
> +#pragma GCC target "+sve2+ssve-bitperm"
> +
> +/*
> +** bgrp_u32_tied1:
> +** bgrp z0\.s, z0\.s, z1\.s
> +** ret
> +*/
> +TEST_UNIFORM_Z (bgrp_u32_tied1, svuint32_t,
> + z0 = svbgrp_u32 (z0, z1),
> + z0 = svbgrp (z0, z1))
> +
> +/*
> +** bgrp_u32_tied2:
> +** bgrp z0\.s, z1\.s, z0\.s
> +** ret
> +*/
> +TEST_UNIFORM_Z (bgrp_u32_tied2, svuint32_t,
> + z0 = svbgrp_u32 (z1, z0),
> + z0 = svbgrp (z1, z0))
> +
> +/*
> +** bgrp_u32_untied:
> +** bgrp z0\.s, z1\.s, z2\.s
> +** ret
> +*/
> +TEST_UNIFORM_Z (bgrp_u32_untied, svuint32_t,
> + z0 = svbgrp_u32 (z1, z2),
> + z0 = svbgrp (z1, z2))
> +
> +/*
> +** bgrp_w0_u32_tied1:
> +** mov (z[0-9]+\.s), w0
> +** bgrp z0\.s, z0\.s, \1
> +** ret
> +*/
> +TEST_UNIFORM_ZX (bgrp_w0_u32_tied1, svuint32_t, uint32_t,
> + z0 = svbgrp_n_u32 (z0, x0),
> + z0 = svbgrp (z0, x0))
> +
> +/*
> +** bgrp_w0_u32_untied:
> +** mov (z[0-9]+\.s), w0
> +** bgrp z0\.s, z1\.s, \1
> +** ret
> +*/
> +TEST_UNIFORM_ZX (bgrp_w0_u32_untied, svuint32_t, uint32_t,
> + z0 = svbgrp_n_u32 (z1, x0),
> + z0 = svbgrp (z1, x0))
> +
> +/*
> +** bgrp_11_u32_tied1:
> +** mov (z[0-9]+\.s), #11
> +** bgrp z0\.s, z0\.s, \1
> +** ret
> +*/
> +TEST_UNIFORM_Z (bgrp_11_u32_tied1, svuint32_t,
> + z0 = svbgrp_n_u32 (z0, 11),
> + z0 = svbgrp (z0, 11))
> +
> +/*
> +** bgrp_11_u32_untied:
> +** mov (z[0-9]+\.s), #11
> +** bgrp z0\.s, z1\.s, \1
> +** ret
> +*/
> +TEST_UNIFORM_Z (bgrp_11_u32_untied, svuint32_t,
> + z0 = svbgrp_n_u32 (z1, 11),
> + z0 = svbgrp (z1, 11))
> diff --git a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/bgrp_u64.c
> b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/bgrp_u64.c
> new file mode 100644
> index 00000000000..77b37011b24
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/bgrp_u64.c
> @@ -0,0 +1,74 @@
> +/* { dg-do assemble { target aarch64_asm_ssve-bitperm_ok } } */
> +/* { dg-do compile { target { ! aarch64_asm_ssve-bitperm_ok } } } */
> +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
> +
> +#include "test_sme2_acle.h"
> +
> +#pragma GCC target "+sve2+ssve-bitperm"
> +
> +/*
> +** bgrp_u64_tied1:
> +** bgrp z0\.d, z0\.d, z1\.d
> +** ret
> +*/
> +TEST_UNIFORM_Z (bgrp_u64_tied1, svuint64_t,
> + z0 = svbgrp_u64 (z0, z1),
> + z0 = svbgrp (z0, z1))
> +
> +/*
> +** bgrp_u64_tied2:
> +** bgrp z0\.d, z1\.d, z0\.d
> +** ret
> +*/
> +TEST_UNIFORM_Z (bgrp_u64_tied2, svuint64_t,
> + z0 = svbgrp_u64 (z1, z0),
> + z0 = svbgrp (z1, z0))
> +
> +/*
> +** bgrp_u64_untied:
> +** bgrp z0\.d, z1\.d, z2\.d
> +** ret
> +*/
> +TEST_UNIFORM_Z (bgrp_u64_untied, svuint64_t,
> + z0 = svbgrp_u64 (z1, z2),
> + z0 = svbgrp (z1, z2))
> +
> +/*
> +** bgrp_x0_u64_tied1:
> +** mov (z[0-9]+\.d), x0
> +** bgrp z0\.d, z0\.d, \1
> +** ret
> +*/
> +TEST_UNIFORM_ZX (bgrp_x0_u64_tied1, svuint64_t, uint64_t,
> + z0 = svbgrp_n_u64 (z0, x0),
> + z0 = svbgrp (z0, x0))
> +
> +/*
> +** bgrp_x0_u64_untied:
> +** mov (z[0-9]+\.d), x0
> +** bgrp z0\.d, z1\.d, \1
> +** ret
> +*/
> +TEST_UNIFORM_ZX (bgrp_x0_u64_untied, svuint64_t, uint64_t,
> + z0 = svbgrp_n_u64 (z1, x0),
> + z0 = svbgrp (z1, x0))
> +
> +/*
> +** bgrp_11_u64_tied1:
> +** mov (z[0-9]+\.d), #11
> +** bgrp z0\.d, z0\.d, \1
> +** ret
> +*/
> +TEST_UNIFORM_Z (bgrp_11_u64_tied1, svuint64_t,
> + z0 = svbgrp_n_u64 (z0, 11),
> + z0 = svbgrp (z0, 11))
> +
> +/*
> +** bgrp_11_u64_untied:
> +** mov (z[0-9]+\.d), #11
> +** bgrp z0\.d, z1\.d, \1
> +** ret
> +*/
> +TEST_UNIFORM_Z (bgrp_11_u64_untied, svuint64_t,
> + z0 = svbgrp_n_u64 (z1, 11),
> + z0 = svbgrp (z1, 11))
> diff --git a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/bgrp_u8.c
> b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/bgrp_u8.c
> new file mode 100644
> index 00000000000..d4abcd1bbbf
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/bgrp_u8.c
> @@ -0,0 +1,74 @@
> +/* { dg-do assemble { target aarch64_asm_ssve-bitperm_ok } } */
> +/* { dg-do compile { target { ! aarch64_asm_ssve-bitperm_ok } } } */
> +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
> +
> +#include "test_sme2_acle.h"
> +
> +#pragma GCC target "+sve2+ssve-bitperm"
> +
> +/*
> +** bgrp_u8_tied1:
> +** bgrp z0\.b, z0\.b, z1\.b
> +** ret
> +*/
> +TEST_UNIFORM_Z (bgrp_u8_tied1, svuint8_t,
> + z0 = svbgrp_u8 (z0, z1),
> + z0 = svbgrp (z0, z1))
> +
> +/*
> +** bgrp_u8_tied2:
> +** bgrp z0\.b, z1\.b, z0\.b
> +** ret
> +*/
> +TEST_UNIFORM_Z (bgrp_u8_tied2, svuint8_t,
> + z0 = svbgrp_u8 (z1, z0),
> + z0 = svbgrp (z1, z0))
> +
> +/*
> +** bgrp_u8_untied:
> +** bgrp z0\.b, z1\.b, z2\.b
> +** ret
> +*/
> +TEST_UNIFORM_Z (bgrp_u8_untied, svuint8_t,
> + z0 = svbgrp_u8 (z1, z2),
> + z0 = svbgrp (z1, z2))
> +
> +/*
> +** bgrp_w0_u8_tied1:
> +** mov (z[0-9]+\.b), w0
> +** bgrp z0\.b, z0\.b, \1
> +** ret
> +*/
> +TEST_UNIFORM_ZX (bgrp_w0_u8_tied1, svuint8_t, uint8_t,
> + z0 = svbgrp_n_u8 (z0, x0),
> + z0 = svbgrp (z0, x0))
> +
> +/*
> +** bgrp_w0_u8_untied:
> +** mov (z[0-9]+\.b), w0
> +** bgrp z0\.b, z1\.b, \1
> +** ret
> +*/
> +TEST_UNIFORM_ZX (bgrp_w0_u8_untied, svuint8_t, uint8_t,
> + z0 = svbgrp_n_u8 (z1, x0),
> + z0 = svbgrp (z1, x0))
> +
> +/*
> +** bgrp_11_u8_tied1:
> +** mov (z[0-9]+\.b), #11
> +** bgrp z0\.b, z0\.b, \1
> +** ret
> +*/
> +TEST_UNIFORM_Z (bgrp_11_u8_tied1, svuint8_t,
> + z0 = svbgrp_n_u8 (z0, 11),
> + z0 = svbgrp (z0, 11))
> +
> +/*
> +** bgrp_11_u8_untied:
> +** mov (z[0-9]+\.b), #11
> +** bgrp z0\.b, z1\.b, \1
> +** ret
> +*/
> +TEST_UNIFORM_Z (bgrp_11_u8_untied, svuint8_t,
> + z0 = svbgrp_n_u8 (z1, 11),
> + z0 = svbgrp (z1, 11))
> diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bdep_u16.c
> b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bdep_u16.c
> index c1a4e10614f..13e9f69ddf4 100644
> --- a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bdep_u16.c
> +++ b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bdep_u16.c
> @@ -1,9 +1,14 @@
> -/* { dg-skip-if "" { *-*-* } { "-DSTREAMING_COMPATIBLE" } { "" } } */
> +/* { dg-do assemble { target aarch64_asm_ssve-bitperm_ok } } */
> +/* { dg-do compile { target { ! aarch64_asm_ssve-bitperm_ok } } } */
> /* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
>
> #include "test_sve_acle.h"
>
> +#ifdef STREAMING_COMPATIBLE
> +#pragma GCC target "+sve2+ssve-bitperm"
> +#else
> #pragma GCC target "+sve2-bitperm"
> +#endif
>
> /*
> ** bdep_u16_tied1:
> diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bdep_u32.c
> b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bdep_u32.c
> index 4f14cc4c432..07f3743c507 100644
> --- a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bdep_u32.c
> +++ b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bdep_u32.c
> @@ -1,9 +1,14 @@
> -/* { dg-skip-if "" { *-*-* } { "-DSTREAMING_COMPATIBLE" } { "" } } */
> +/* { dg-do assemble { target aarch64_asm_ssve-bitperm_ok } } */
> +/* { dg-do compile { target { ! aarch64_asm_ssve-bitperm_ok } } } */
> /* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
>
> #include "test_sve_acle.h"
>
> +#ifdef STREAMING_COMPATIBLE
> +#pragma GCC target "+sve2+ssve-bitperm"
> +#else
> #pragma GCC target "+sve2-bitperm"
> +#endif
>
> /*
> ** bdep_u32_tied1:
> diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bdep_u64.c
> b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bdep_u64.c
> index 091253ec60b..f43161436a6 100644
> --- a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bdep_u64.c
> +++ b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bdep_u64.c
> @@ -1,9 +1,14 @@
> -/* { dg-skip-if "" { *-*-* } { "-DSTREAMING_COMPATIBLE" } { "" } } */
> +/* { dg-do assemble { target aarch64_asm_ssve-bitperm_ok } } */
> +/* { dg-do compile { target { ! aarch64_asm_ssve-bitperm_ok } } } */
> /* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
>
> #include "test_sve_acle.h"
>
> +#ifdef STREAMING_COMPATIBLE
> +#pragma GCC target "+sve2+ssve-bitperm"
> +#else
> #pragma GCC target "+sve2-bitperm"
> +#endif
>
> /*
> ** bdep_u64_tied1:
> diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bdep_u8.c
> b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bdep_u8.c
> index deb1ad27d90..f7b25e89b6c 100644
> --- a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bdep_u8.c
> +++ b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bdep_u8.c
> @@ -1,9 +1,14 @@
> -/* { dg-skip-if "" { *-*-* } { "-DSTREAMING_COMPATIBLE" } { "" } } */
> +/* { dg-do assemble { target aarch64_asm_ssve-bitperm_ok } } */
> +/* { dg-do compile { target { ! aarch64_asm_ssve-bitperm_ok } } } */
> /* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
>
> #include "test_sve_acle.h"
>
> +#ifdef STREAMING_COMPATIBLE
> +#pragma GCC target "+sve2+ssve-bitperm"
> +#else
> #pragma GCC target "+sve2-bitperm"
> +#endif
>
> /*
> ** bdep_u8_tied1:
> diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bext_u16.c
> b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bext_u16.c
> index 9efa501efa8..dfba13195e1 100644
> --- a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bext_u16.c
> +++ b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bext_u16.c
> @@ -1,9 +1,14 @@
> -/* { dg-skip-if "" { *-*-* } { "-DSTREAMING_COMPATIBLE" } { "" } } */
> +/* { dg-do assemble { target aarch64_asm_ssve-bitperm_ok } } */
> +/* { dg-do compile { target { ! aarch64_asm_ssve-bitperm_ok } } } */
> /* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
>
> #include "test_sve_acle.h"
>
> +#ifdef STREAMING_COMPATIBLE
> +#pragma GCC target "+sve2+ssve-bitperm"
> +#else
> #pragma GCC target "+sve2-bitperm"
> +#endif
>
> /*
> ** bext_u16_tied1:
> diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bext_u32.c
> b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bext_u32.c
> index 18963da5bd3..d85c6001497 100644
> --- a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bext_u32.c
> +++ b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bext_u32.c
> @@ -1,9 +1,14 @@
> -/* { dg-skip-if "" { *-*-* } { "-DSTREAMING_COMPATIBLE" } { "" } } */
> +/* { dg-do assemble { target aarch64_asm_ssve-bitperm_ok } } */
> +/* { dg-do compile { target { ! aarch64_asm_ssve-bitperm_ok } } } */
> /* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
>
> #include "test_sve_acle.h"
>
> +#ifdef STREAMING_COMPATIBLE
> +#pragma GCC target "+sve2+ssve-bitperm"
> +#else
> #pragma GCC target "+sve2-bitperm"
> +#endif
>
> /*
> ** bext_u32_tied1:
> diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bext_u64.c
> b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bext_u64.c
> index 91591f93b88..4f116cda911 100644
> --- a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bext_u64.c
> +++ b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bext_u64.c
> @@ -1,9 +1,14 @@
> -/* { dg-skip-if "" { *-*-* } { "-DSTREAMING_COMPATIBLE" } { "" } } */
> +/* { dg-do assemble { target aarch64_asm_ssve-bitperm_ok } } */
> +/* { dg-do compile { target { ! aarch64_asm_ssve-bitperm_ok } } } */
> /* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
>
> #include "test_sve_acle.h"
>
> +#ifdef STREAMING_COMPATIBLE
> +#pragma GCC target "+sve2+ssve-bitperm"
> +#else
> #pragma GCC target "+sve2-bitperm"
> +#endif
>
> /*
> ** bext_u64_tied1:
> diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bext_u8.c
> b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bext_u8.c
> index 1211587ef41..ab3b7597360 100644
> --- a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bext_u8.c
> +++ b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bext_u8.c
> @@ -1,9 +1,14 @@
> -/* { dg-skip-if "" { *-*-* } { "-DSTREAMING_COMPATIBLE" } { "" } } */
> +/* { dg-do assemble { target aarch64_asm_ssve-bitperm_ok } } */
> +/* { dg-do compile { target { ! aarch64_asm_ssve-bitperm_ok } } } */
> /* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
>
> #include "test_sve_acle.h"
>
> +#ifdef STREAMING_COMPATIBLE
> +#pragma GCC target "+sve2+ssve-bitperm"
> +#else
> #pragma GCC target "+sve2-bitperm"
> +#endif
>
> /*
> ** bext_u8_tied1:
> diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bgrp_u16.c
> b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bgrp_u16.c
> index 72868bea7f6..ea4aff89c77 100644
> --- a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bgrp_u16.c
> +++ b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bgrp_u16.c
> @@ -1,9 +1,14 @@
> -/* { dg-skip-if "" { *-*-* } { "-DSTREAMING_COMPATIBLE" } { "" } } */
> +/* { dg-do assemble { target aarch64_asm_ssve-bitperm_ok } } */
> +/* { dg-do compile { target { ! aarch64_asm_ssve-bitperm_ok } } } */
> /* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
>
> #include "test_sve_acle.h"
>
> +#ifdef STREAMING_COMPATIBLE
> +#pragma GCC target "+sve2+ssve-bitperm"
> +#else
> #pragma GCC target "+sve2-bitperm"
> +#endif
>
> /*
> ** bgrp_u16_tied1:
> diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bgrp_u32.c
> b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bgrp_u32.c
> index c8923816fe4..5c61236d546 100644
> --- a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bgrp_u32.c
> +++ b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bgrp_u32.c
> @@ -1,9 +1,14 @@
> -/* { dg-skip-if "" { *-*-* } { "-DSTREAMING_COMPATIBLE" } { "" } } */
> +/* { dg-do assemble { target aarch64_asm_ssve-bitperm_ok } } */
> +/* { dg-do compile { target { ! aarch64_asm_ssve-bitperm_ok } } } */
> /* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
>
> #include "test_sve_acle.h"
>
> +#ifdef STREAMING_COMPATIBLE
> +#pragma GCC target "+sve2+ssve-bitperm"
> +#else
> #pragma GCC target "+sve2-bitperm"
> +#endif
>
> /*
> ** bgrp_u32_tied1:
> diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bgrp_u64.c
> b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bgrp_u64.c
> index 86989529faf..e96ae5c275a 100644
> --- a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bgrp_u64.c
> +++ b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bgrp_u64.c
> @@ -1,9 +1,14 @@
> -/* { dg-skip-if "" { *-*-* } { "-DSTREAMING_COMPATIBLE" } { "" } } */
> +/* { dg-do assemble { target aarch64_asm_ssve-bitperm_ok } } */
> +/* { dg-do compile { target { ! aarch64_asm_ssve-bitperm_ok } } } */
> /* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
>
> #include "test_sve_acle.h"
>
> +#ifdef STREAMING_COMPATIBLE
> +#pragma GCC target "+sve2+ssve-bitperm"
> +#else
> #pragma GCC target "+sve2-bitperm"
> +#endif
>
> /*
> ** bgrp_u64_tied1:
> diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bgrp_u8.c
> b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bgrp_u8.c
> index 5cd941a7a6e..55ea7a906e1 100644
> --- a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bgrp_u8.c
> +++ b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bgrp_u8.c
> @@ -1,9 +1,14 @@
> -/* { dg-skip-if "" { *-*-* } { "-DSTREAMING_COMPATIBLE" } { "" } } */
> +/* { dg-do assemble { target aarch64_asm_ssve-bitperm_ok } } */
> +/* { dg-do compile { target { ! aarch64_asm_ssve-bitperm_ok } } } */
> /* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
>
> #include "test_sve_acle.h"
>
> +#ifdef STREAMING_COMPATIBLE
> +#pragma GCC target "+sve2+ssve-bitperm"
> +#else
> #pragma GCC target "+sve2-bitperm"
> +#endif
>
> /*
> ** bgrp_u8_tied1:
> diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-
> supports.exp
> index 9c2d71137a0..081563193fd 100644
> --- a/gcc/testsuite/lib/target-supports.exp
> +++ b/gcc/testsuite/lib/target-supports.exp
> @@ -12544,7 +12544,7 @@ set exts {
> # archiecture for SME and the features that require it.
> set exts_sve2 {
> "sme-b16b16" "sme-f16f16" "sme-i16i64" "sme" "sme2" "sme2p1"
> - "ssve-fp8dot2" "ssve-fp8dot4" "ssve-fp8fma"
> + "ssve-fp8dot2" "ssve-fp8dot4" "ssve-fp8fma" "ssve-bitperm"
> }
>
> foreach { aarch64_ext } $exts {
> --
> 2.34.1