}
};
+class svexpand_impl
+ : public QUIET_CODE_FOR_MODE0 (aarch64_sve_expand)
+{
+public:
+ gimple *
+ fold (gimple_folder &f) const override
+ {
+ if (is_pfalse (gimple_call_arg (f.call, 0)))
+ return f.fold_call_to (build_zero_cst (TREE_TYPE (f.lhs)));
+ return NULL;
+ }
+};
+
/* Implements svextb, svexth and svextw. */
class svext_bhw_impl : public function_base
{
FUNCTION (sveor, rtx_code_function, (XOR, XOR, -1))
FUNCTION (sveorv, sveorv_impl,)
FUNCTION (svexpa, unspec_based_function, (-1, -1, UNSPEC_FEXPA))
+FUNCTION (svexpand, svexpand_impl,)
FUNCTION (svext, QUIET_CODE_FOR_MODE0 (aarch64_sve_ext),)
FUNCTION (svextb, svext_bhw_impl, (QImode))
FUNCTION (svexth, svext_bhw_impl, (HImode))
DEF_SVE_FUNCTION (svadrd, adr_index, none, none)
DEF_SVE_FUNCTION (svadrh, adr_index, none, none)
DEF_SVE_FUNCTION (svadrw, adr_index, none, none)
-DEF_SVE_FUNCTION (svcompact, unary, sd_data, implicit)
DEF_SVE_FUNCTION (svexpa, unary_uint, all_float, none)
DEF_SVE_FUNCTION (svld1_gather, load_gather_sv, sd_data, implicit)
DEF_SVE_FUNCTION (svld1_gather, load_gather_vs, sd_data, implicit)
DEF_SVE_FUNCTION (svzip1q, binary, all_data, none)
DEF_SVE_FUNCTION (svzip2q, binary, all_data, none)
#undef REQUIRED_EXTENSIONS
+
+#define REQUIRED_EXTENSIONS sve_and_sme (0, AARCH64_FL_SME2p2)
+DEF_SVE_FUNCTION (svcompact, unary, sd_data, implicit)
+#undef REQUIRED_EXTENSIONS
extern const function_base *const sveor;
extern const function_base *const sveorv;
extern const function_base *const svexpa;
+ extern const function_base *const svexpand;
extern const function_base *const svext;
extern const function_base *const svextb;
extern const function_base *const svexth;
DEF_SVE_FUNCTION (svcvtnt, unary_convert_narrowt, cvt_narrow, z)
DEF_SVE_FUNCTION (svcvtnt, unary_convert_narrowt, cvt_bfloat, z)
DEF_SVE_FUNCTION (svcvtxnt, unary_convert_narrowt, cvt_narrow_s, z)
+DEF_SVE_FUNCTION (svcompact, unary, bh_data, implicit)
+DEF_SVE_FUNCTION (svexpand, unary, all_data, implicit)
DEF_SVE_FUNCTION (svfirstp, count_pred, all_pred, implicit)
DEF_SVE_FUNCTION (svlastp, count_pred, all_pred, implicit)
DEF_SVE_FUNCTION (svrint32x, unary, sd_float, mxz)
;; ---- [INT,FP] Special-purpose unary permutes
;; -------------------------------------------------------------------------
;; Includes:
-;; - COMPACT
+;; - COMPACT word/doubleword
+;; - COMPACT byte/halfword (SVE2p2)
+;; - EXPAND (SVE2p2)
;; - DUP
;; - REV
;; -------------------------------------------------------------------------
[(match_operand:<VPRED> 1 "register_operand" "Upl")
(match_operand:SVE_FULL_SD 2 "register_operand" "w")]
UNSPEC_SVE_COMPACT))]
- "TARGET_SVE && TARGET_NON_STREAMING"
+ "TARGET_SVE_OR_SME2p2"
+ "compact\t%0.<Vetype>, %1, %2.<Vetype>"
+ [(set_attr "sve_type" "sve_int_extract")]
+)
+
+(define_insn "@aarch64_sve_compact<mode>"
+ [(set (match_operand:SVE_FULL_BH 0 "register_operand" "=w")
+ (unspec:SVE_FULL_BH
+ [(match_operand:<VPRED> 1 "register_operand" "Upl")
+ (match_operand:SVE_FULL_BH 2 "register_operand" "w")]
+ UNSPEC_SVE_COMPACT))]
+ "TARGET_SVE2p2_OR_SME2p2"
"compact\t%0.<Vetype>, %1, %2.<Vetype>"
[(set_attr "sve_type" "sve_int_extract")]
)
+;; Expand into active elements and set inactive elements to zero.
+(define_insn "@aarch64_sve_expand<mode>"
+ [(set (match_operand:SVE_FULL 0 "register_operand" "=w")
+ (unspec:SVE_FULL
+ [(match_operand:<VPRED> 1 "register_operand" "Upl")
+ (match_operand:SVE_FULL 2 "register_operand" "w")]
+ UNSPEC_SVE_EXPAND))]
+ "TARGET_SVE2p2_OR_SME2p2"
+ "expand\t%0.<Vetype>, %1, %2.<Vetype>"
+ [(set_attr "sve_type" "sve_int_extract")]
+)
+
;; Duplicate one element of a vector.
(define_insn "@aarch64_sve_dup_lane<mode>"
[(set (match_operand:SVE_ALL 0 "register_operand" "=w")
/* Combinatorial tests. */
+#define TARGET_SVE_OR_SME2p2 \
+ ((TARGET_SVE || TARGET_STREAMING) \
+ && (TARGET_SME2p2 || TARGET_NON_STREAMING))
+
#define TARGET_SVE2_OR_SME2 \
((TARGET_SVE2 || TARGET_STREAMING) \
&& (TARGET_SME2 || TARGET_NON_STREAMING))
UNSPEC_SVE_PREFETCH
UNSPEC_SVE_PREFETCH_GATHER
UNSPEC_SVE_COMPACT
+ UNSPEC_SVE_EXPAND
UNSPEC_SVE_SPLICE
UNSPEC_GEN_TAG ; Generate a 4-bit MTE tag.
UNSPEC_GEN_TAG_RND ; Generate a random 4-bit MTE tag.
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+sme2p2"
extern svbool_t &pred;
set streaming_ok {
s8 = svadd_x (pred, s8, s8)
s8 = svld1 (pred, s8_ptr)
+ u32 = svcompact (pred, u32)
}
# This order follows the list in the SME manual.
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)
f32 = svmmla (f32, f32, f32)
--- /dev/null
+/* { dg-do assemble { target aarch64_asm_sve2p2_ok } } */
+/* { dg-do compile { target { ! aarch64_asm_sve2p2_ok } } } */
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sve2p2"
+#ifdef STREAMING_COMPATIBLE
+#pragma GCC target "+sme2p2"
+#endif
+
+/*
+** compact_bf16_tied1:
+** compact z0\.h, p0, z0\.h
+** ret
+*/
+TEST_UNIFORM_Z (compact_bf16_tied1, svbfloat16_t,
+ z0 = svcompact_bf16 (p0, z0),
+ z0 = svcompact (p0, z0))
+
+/*
+** compact_bf16_untied:
+** compact z0\.h, p0, z1\.h
+** ret
+*/
+TEST_UNIFORM_Z (compact_bf16_untied, svbfloat16_t,
+ z0 = svcompact_bf16 (p0, z1),
+ z0 = svcompact (p0, z1))
--- /dev/null
+/* { dg-do assemble { target aarch64_asm_sve2p2_ok } } */
+/* { dg-do compile { target { ! aarch64_asm_sve2p2_ok } } } */
+/* { dg-skip-if "" { *-*-* } { "" } { "-DSTREAMING_COMPATIBLE" } } */
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sme2p2"
+
+#include "../../../sve/acle/asm/compact_f32.c"
+
+/*
+** compact_f32_tied1:
+** compact z0\.s, p0, z0\.s
+** ret
+*/
+
+/*
+** compact_f32_untied:
+** compact z0\.s, p0, z1\.s
+** ret
+*/
--- /dev/null
+/* { dg-do assemble { target aarch64_asm_sve2p2_ok } } */
+/* { dg-do compile { target { ! aarch64_asm_sve2p2_ok } } } */
+/* { dg-skip-if "" { *-*-* } { "" } { "-DSTREAMING_COMPATIBLE" } } */
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sme2p2"
+
+#include "../../../sve/acle/asm/compact_f64.c"
+
+/*
+** compact_f64_tied1:
+** compact z0\.d, p0, z0\.d
+** ret
+*/
+
+/*
+** compact_f64_untied:
+** compact z0\.d, p0, z1\.d
+** ret
+*/
--- /dev/null
+/* { dg-do assemble { target aarch64_asm_sve2p2_ok } } */
+/* { dg-do compile { target { ! aarch64_asm_sve2p2_ok } } } */
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sve2p2"
+#ifdef STREAMING_COMPATIBLE
+#pragma GCC target "+sme2p2"
+#endif
+
+/*
+** compact_mf8_tied1:
+** compact z0\.b, p0, z0\.b
+** ret
+*/
+TEST_UNIFORM_Z (compact_mf8_tied1, svmfloat8_t,
+ z0 = svcompact_mf8 (p0, z0),
+ z0 = svcompact (p0, z0))
+
+/*
+** compact_mf8_untied:
+** compact z0\.b, p0, z1\.b
+** ret
+*/
+TEST_UNIFORM_Z (compact_mf8_untied, svmfloat8_t,
+ z0 = svcompact_mf8 (p0, z1),
+ z0 = svcompact (p0, z1))
--- /dev/null
+/* { dg-do assemble { target aarch64_asm_sve2p2_ok } } */
+/* { dg-do compile { target { ! aarch64_asm_sve2p2_ok } } } */
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sve2p2"
+#ifdef STREAMING_COMPATIBLE
+#pragma GCC target "+sme2p2"
+#endif
+
+/*
+** compact_s16_tied1:
+** compact z0\.h, p0, z0\.h
+** ret
+*/
+TEST_UNIFORM_Z (compact_s16_tied1, svint16_t,
+ z0 = svcompact_s16 (p0, z0),
+ z0 = svcompact (p0, z0))
+
+/*
+** compact_s16_untied:
+** compact z0\.h, p0, z1\.h
+** ret
+*/
+TEST_UNIFORM_Z (compact_s16_untied, svint16_t,
+ z0 = svcompact_s16 (p0, z1),
+ z0 = svcompact (p0, z1))
--- /dev/null
+/* { dg-do assemble { target aarch64_asm_sve2p2_ok } } */
+/* { dg-do compile { target { ! aarch64_asm_sve2p2_ok } } } */
+/* { dg-skip-if "" { *-*-* } { "" } { "-DSTREAMING_COMPATIBLE" } } */
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sme2p2"
+
+#include "../../../sve/acle/asm/compact_s32.c"
+
+/*
+** compact_s32_tied1:
+** compact z0\.s, p0, z0\.s
+** ret
+*/
+
+/*
+** compact_s32_untied:
+** compact z0\.s, p0, z1\.s
+** ret
+*/
--- /dev/null
+/* { dg-do assemble { target aarch64_asm_sve2p2_ok } } */
+/* { dg-do compile { target { ! aarch64_asm_sve2p2_ok } } } */
+/* { dg-skip-if "" { *-*-* } { "" } { "-DSTREAMING_COMPATIBLE" } } */
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sme2p2"
+
+#include "../../../sve/acle/asm/compact_s64.c"
+
+/*
+** compact_s64_tied1:
+** compact z0\.d, p0, z0\.d
+** ret
+*/
+
+/*
+** compact_s64_untied:
+** compact z0\.d, p0, z1\.d
+** ret
+*/
--- /dev/null
+/* { dg-do assemble { target aarch64_asm_sve2p2_ok } } */
+/* { dg-do compile { target { ! aarch64_asm_sve2p2_ok } } } */
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sve2p2"
+#ifdef STREAMING_COMPATIBLE
+#pragma GCC target "+sme2p2"
+#endif
+
+/*
+** compact_s8_tied1:
+** compact z0\.b, p0, z0\.b
+** ret
+*/
+TEST_UNIFORM_Z (compact_s8_tied1, svint8_t,
+ z0 = svcompact_s8 (p0, z0),
+ z0 = svcompact (p0, z0))
+
+/*
+** compact_s8_untied:
+** compact z0\.b, p0, z1\.b
+** ret
+*/
+TEST_UNIFORM_Z (compact_s8_untied, svint8_t,
+ z0 = svcompact_s8 (p0, z1),
+ z0 = svcompact (p0, z1))
--- /dev/null
+/* { dg-do assemble { target aarch64_asm_sve2p2_ok } } */
+/* { dg-do compile { target { ! aarch64_asm_sve2p2_ok } } } */
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sve2p2"
+#ifdef STREAMING_COMPATIBLE
+#pragma GCC target "+sme2p2"
+#endif
+
+/*
+** compact_u16_tied1:
+** compact z0\.h, p0, z0\.h
+** ret
+*/
+TEST_UNIFORM_Z (compact_u16_tied1, svuint16_t,
+ z0 = svcompact_u16 (p0, z0),
+ z0 = svcompact (p0, z0))
+
+/*
+** compact_u16_untied:
+** compact z0\.h, p0, z1\.h
+** ret
+*/
+TEST_UNIFORM_Z (compact_u16_untied, svuint16_t,
+ z0 = svcompact_u16 (p0, z1),
+ z0 = svcompact (p0, z1))
--- /dev/null
+/* { dg-do assemble { target aarch64_asm_sve2p2_ok } } */
+/* { dg-do compile { target { ! aarch64_asm_sve2p2_ok } } } */
+/* { dg-skip-if "" { *-*-* } { "" } { "-DSTREAMING_COMPATIBLE" } } */
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sme2p2"
+
+#include "../../../sve/acle/asm/compact_u32.c"
+
+/*
+** compact_u32_tied1:
+** compact z0\.s, p0, z0\.s
+** ret
+*/
+
+/*
+** compact_u32_untied:
+** compact z0\.s, p0, z1\.s
+** ret
+*/
--- /dev/null
+/* { dg-do assemble { target aarch64_asm_sve2p2_ok } } */
+/* { dg-do compile { target { ! aarch64_asm_sve2p2_ok } } } */
+/* { dg-skip-if "" { *-*-* } { "" } { "-DSTREAMING_COMPATIBLE" } } */
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sme2p2"
+
+#include "../../../sve/acle/asm/compact_u64.c"
+
+/*
+** compact_u64_tied1:
+** compact z0\.d, p0, z0\.d
+** ret
+*/
+
+/*
+** compact_u64_untied:
+** compact z0\.d, p0, z1\.d
+** ret
+*/
--- /dev/null
+/* { dg-do assemble { target aarch64_asm_sve2p2_ok } } */
+/* { dg-do compile { target { ! aarch64_asm_sve2p2_ok } } } */
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sve2p2"
+#ifdef STREAMING_COMPATIBLE
+#pragma GCC target "+sme2p2"
+#endif
+
+/*
+** compact_u8_tied1:
+** compact z0\.b, p0, z0\.b
+** ret
+*/
+TEST_UNIFORM_Z (compact_u8_tied1, svuint8_t,
+ z0 = svcompact_u8 (p0, z0),
+ z0 = svcompact (p0, z0))
+
+/*
+** compact_u8_untied:
+** compact z0\.b, p0, z1\.b
+** ret
+*/
+TEST_UNIFORM_Z (compact_u8_untied, svuint8_t,
+ z0 = svcompact_u8 (p0, z1),
+ z0 = svcompact (p0, z1))
--- /dev/null
+/* { dg-do assemble { target aarch64_asm_sve2p2_ok } } */
+/* { dg-do compile { target { ! aarch64_asm_sve2p2_ok } } } */
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sve2p2"
+#ifdef STREAMING_COMPATIBLE
+#pragma GCC target "+sme2p2"
+#endif
+
+/*
+** expand_bf16_tied1:
+** expand z0\.h, p0, z0\.h
+** ret
+*/
+TEST_UNIFORM_Z (expand_bf16_tied1, svbfloat16_t,
+ z0 = svexpand_bf16 (p0, z0),
+ z0 = svexpand (p0, z0))
+
+/*
+** expand_bf16_untied:
+** expand z0\.h, p0, z1\.h
+** ret
+*/
+TEST_UNIFORM_Z (expand_bf16_untied, svbfloat16_t,
+ z0 = svexpand_bf16 (p0, z1),
+ z0 = svexpand (p0, z1))
--- /dev/null
+/* { dg-do assemble { target aarch64_asm_sve2p2_ok } } */
+/* { dg-do compile { target { ! aarch64_asm_sve2p2_ok } } } */
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sve2p2"
+#ifdef STREAMING_COMPATIBLE
+#pragma GCC target "+sme2p2"
+#endif
+
+/*
+** expand_f32_tied1:
+** expand z0\.s, p0, z0\.s
+** ret
+*/
+TEST_UNIFORM_Z (expand_f32_tied1, svfloat32_t,
+ z0 = svexpand_f32 (p0, z0),
+ z0 = svexpand (p0, z0))
+
+/*
+** expand_f32_untied:
+** expand z0\.s, p0, z1\.s
+** ret
+*/
+TEST_UNIFORM_Z (expand_f32_untied, svfloat32_t,
+ z0 = svexpand_f32 (p0, z1),
+ z0 = svexpand (p0, z1))
--- /dev/null
+/* { dg-do assemble { target aarch64_asm_sve2p2_ok } } */
+/* { dg-do compile { target { ! aarch64_asm_sve2p2_ok } } } */
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sve2p2"
+#ifdef STREAMING_COMPATIBLE
+#pragma GCC target "+sme2p2"
+#endif
+
+/*
+** expand_f64_tied1:
+** expand z0\.d, p0, z0\.d
+** ret
+*/
+TEST_UNIFORM_Z (expand_f64_tied1, svfloat64_t,
+ z0 = svexpand_f64 (p0, z0),
+ z0 = svexpand (p0, z0))
+
+/*
+** expand_f64_untied:
+** expand z0\.d, p0, z1\.d
+** ret
+*/
+TEST_UNIFORM_Z (expand_f64_untied, svfloat64_t,
+ z0 = svexpand_f64 (p0, z1),
+ z0 = svexpand (p0, z1))
--- /dev/null
+/* { dg-do assemble { target aarch64_asm_sve2p2_ok } } */
+/* { dg-do compile { target { ! aarch64_asm_sve2p2_ok } } } */
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sve2p2"
+#ifdef STREAMING_COMPATIBLE
+#pragma GCC target "+sme2p2"
+#endif
+
+/*
+** expand_mf8_tied1:
+** expand z0\.b, p0, z0\.b
+** ret
+*/
+TEST_UNIFORM_Z (expand_mf8_tied1, svmfloat8_t,
+ z0 = svexpand_mf8 (p0, z0),
+ z0 = svexpand (p0, z0))
+
+/*
+** expand_mf8_untied:
+** expand z0\.b, p0, z1\.b
+** ret
+*/
+TEST_UNIFORM_Z (expand_mf8_untied, svmfloat8_t,
+ z0 = svexpand_mf8 (p0, z1),
+ z0 = svexpand (p0, z1))
--- /dev/null
+/* { dg-do assemble { target aarch64_asm_sve2p2_ok } } */
+/* { dg-do compile { target { ! aarch64_asm_sve2p2_ok } } } */
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sve2p2"
+#ifdef STREAMING_COMPATIBLE
+#pragma GCC target "+sme2p2"
+#endif
+
+/*
+** expand_s16_tied1:
+** expand z0\.h, p0, z0\.h
+** ret
+*/
+TEST_UNIFORM_Z (expand_s16_tied1, svint16_t,
+ z0 = svexpand_s16 (p0, z0),
+ z0 = svexpand (p0, z0))
+
+/*
+** expand_s16_untied:
+** expand z0\.h, p0, z1\.h
+** ret
+*/
+TEST_UNIFORM_Z (expand_s16_untied, svint16_t,
+ z0 = svexpand_s16 (p0, z1),
+ z0 = svexpand (p0, z1))
--- /dev/null
+/* { dg-do assemble { target aarch64_asm_sve2p2_ok } } */
+/* { dg-do compile { target { ! aarch64_asm_sve2p2_ok } } } */
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sve2p2"
+#ifdef STREAMING_COMPATIBLE
+#pragma GCC target "+sme2p2"
+#endif
+
+/*
+** expand_s32_tied1:
+** expand z0\.s, p0, z0\.s
+** ret
+*/
+TEST_UNIFORM_Z (expand_s32_tied1, svint32_t,
+ z0 = svexpand_s32 (p0, z0),
+ z0 = svexpand (p0, z0))
+
+/*
+** expand_s32_untied:
+** expand z0\.s, p0, z1\.s
+** ret
+*/
+TEST_UNIFORM_Z (expand_s32_untied, svint32_t,
+ z0 = svexpand_s32 (p0, z1),
+ z0 = svexpand (p0, z1))
--- /dev/null
+/* { dg-do assemble { target aarch64_asm_sve2p2_ok } } */
+/* { dg-do compile { target { ! aarch64_asm_sve2p2_ok } } } */
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sve2p2"
+#ifdef STREAMING_COMPATIBLE
+#pragma GCC target "+sme2p2"
+#endif
+
+/*
+** expand_s64_tied1:
+** expand z0\.d, p0, z0\.d
+** ret
+*/
+TEST_UNIFORM_Z (expand_s64_tied1, svint64_t,
+ z0 = svexpand_s64 (p0, z0),
+ z0 = svexpand (p0, z0))
+
+/*
+** expand_s64_untied:
+** expand z0\.d, p0, z1\.d
+** ret
+*/
+TEST_UNIFORM_Z (expand_s64_untied, svint64_t,
+ z0 = svexpand_s64 (p0, z1),
+ z0 = svexpand (p0, z1))
--- /dev/null
+/* { dg-do assemble { target aarch64_asm_sve2p2_ok } } */
+/* { dg-do compile { target { ! aarch64_asm_sve2p2_ok } } } */
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sve2p2"
+#ifdef STREAMING_COMPATIBLE
+#pragma GCC target "+sme2p2"
+#endif
+
+/*
+** expand_s8_tied1:
+** expand z0\.b, p0, z0\.b
+** ret
+*/
+TEST_UNIFORM_Z (expand_s8_tied1, svint8_t,
+ z0 = svexpand_s8 (p0, z0),
+ z0 = svexpand (p0, z0))
+
+/*
+** expand_s8_untied:
+** expand z0\.b, p0, z1\.b
+** ret
+*/
+TEST_UNIFORM_Z (expand_s8_untied, svint8_t,
+ z0 = svexpand_s8 (p0, z1),
+ z0 = svexpand (p0, z1))
--- /dev/null
+/* { dg-do assemble { target aarch64_asm_sve2p2_ok } } */
+/* { dg-do compile { target { ! aarch64_asm_sve2p2_ok } } } */
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sve2p2"
+#ifdef STREAMING_COMPATIBLE
+#pragma GCC target "+sme2p2"
+#endif
+
+/*
+** expand_u16_tied1:
+** expand z0\.h, p0, z0\.h
+** ret
+*/
+TEST_UNIFORM_Z (expand_u16_tied1, svuint16_t,
+ z0 = svexpand_u16 (p0, z0),
+ z0 = svexpand (p0, z0))
+
+/*
+** expand_u16_untied:
+** expand z0\.h, p0, z1\.h
+** ret
+*/
+TEST_UNIFORM_Z (expand_u16_untied, svuint16_t,
+ z0 = svexpand_u16 (p0, z1),
+ z0 = svexpand (p0, z1))
--- /dev/null
+/* { dg-do assemble { target aarch64_asm_sve2p2_ok } } */
+/* { dg-do compile { target { ! aarch64_asm_sve2p2_ok } } } */
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sve2p2"
+#ifdef STREAMING_COMPATIBLE
+#pragma GCC target "+sme2p2"
+#endif
+
+/*
+** expand_u32_tied1:
+** expand z0\.s, p0, z0\.s
+** ret
+*/
+TEST_UNIFORM_Z (expand_u32_tied1, svuint32_t,
+ z0 = svexpand_u32 (p0, z0),
+ z0 = svexpand (p0, z0))
+
+/*
+** expand_u32_untied:
+** expand z0\.s, p0, z1\.s
+** ret
+*/
+TEST_UNIFORM_Z (expand_u32_untied, svuint32_t,
+ z0 = svexpand_u32 (p0, z1),
+ z0 = svexpand (p0, z1))
--- /dev/null
+/* { dg-do assemble { target aarch64_asm_sve2p2_ok } } */
+/* { dg-do compile { target { ! aarch64_asm_sve2p2_ok } } } */
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sve2p2"
+#ifdef STREAMING_COMPATIBLE
+#pragma GCC target "+sme2p2"
+#endif
+
+/*
+** expand_u64_tied1:
+** expand z0\.d, p0, z0\.d
+** ret
+*/
+TEST_UNIFORM_Z (expand_u64_tied1, svuint64_t,
+ z0 = svexpand_u64 (p0, z0),
+ z0 = svexpand (p0, z0))
+
+/*
+** expand_u64_untied:
+** expand z0\.d, p0, z1\.d
+** ret
+*/
+TEST_UNIFORM_Z (expand_u64_untied, svuint64_t,
+ z0 = svexpand_u64 (p0, z1),
+ z0 = svexpand (p0, z1))
--- /dev/null
+/* { dg-do assemble { target aarch64_asm_sve2p2_ok } } */
+/* { dg-do compile { target { ! aarch64_asm_sve2p2_ok } } } */
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sve2p2"
+#ifdef STREAMING_COMPATIBLE
+#pragma GCC target "+sme2p2"
+#endif
+
+/*
+** expand_u8_tied1:
+** expand z0\.b, p0, z0\.b
+** ret
+*/
+TEST_UNIFORM_Z (expand_u8_tied1, svuint8_t,
+ z0 = svexpand_u8 (p0, z0),
+ z0 = svexpand (p0, z0))
+
+/*
+** expand_u8_untied:
+** expand z0\.b, p0, z1\.b
+** ret
+*/
+TEST_UNIFORM_Z (expand_u8_untied, svuint8_t,
+ z0 = svexpand_u8 (p0, z1),
+ z0 = svexpand (p0, z1))