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))
+
+/* 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)
+/* 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"
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