"mova\tza.d[%w0, %1, vgx<vector_count>], %2"
)
+;; MOVT (vector to table)
+;; Variants are also available for:
+;; [_s8], [_u16], [_s16], [_u32], [_s32], [_u64], [_s64]
+;; [_bf16], [_f16], [_f32], [_f64]
+;; void svwrite_zt[_u8](uint64_t zt0, svuint8_t zt)
+;; __arm_streaming __arm_out ("zt0");
+;; void svwrite_lane_zt[_u8](uint64_t zt0, svuint8_t zt, uint64_t idx)
+;; __arm_streaming __arm_out ("zt0");
+(define_insn "@aarch64_sme_write_zt<SVE_FULL:mode>"
+ [(set (reg:V8DI ZT0_REGNUM)
+ (unspec_volatile:V8DI
+ [(match_operand:SVE_FULL 0 "register_operand" "w")
+ (match_operand:DI 1 "const_int_operand")]
+ UNSPEC_SME_WRITE))]
+ "TARGET_SME_LUTv2"
+ "movt\tzt0 [%1, mul vl], %0"
+)
+
;; -------------------------------------------------------------------------
;; ---- Zeroing
;; -------------------------------------------------------------------------
(define_c_enum "unspec" [
UNSPEC_SME_LUTI
+ UNSPEC_SME_LUTI_ZT
])
(define_insn "@aarch64_sme_lut<LUTI_BITS><mode>"
&& !(<LUTI_BITS> == 4 && <vector_count> == 4 && <elem_bits> == 8)"
"luti<LUTI_BITS>\t%0, zt0, %1[%2]"
)
+
+;; LUTI4 (four registers, 8-bit)
+;; Variants are also available for: _u8
+;; svint8x4_t svluti4_zt_s8_x4 (uint64_t zt0, svuint8x2_t zn)
+;; __arm_streaming __arm_in ("zt0"); */
+(define_insn "aarch64_sme_lut_zt"
+ [(set (match_operand:VNx64QI 0 "aligned_register_operand" "=Uw4")
+ (unspec:VNx64QI
+ [(reg:V8DI ZT0_REGNUM)
+ (reg:DI SME_STATE_REGNUM)
+ (match_operand:VNx32QI 1 "register_operand" "w")]
+ UNSPEC_SME_LUTI_ZT))]
+ "TARGET_SME_LUTv2"
+ "luti4\t%0, zt0, {%Z1 - %T1}"
+)
e<name> - an enum with the given name
s<elt> - a scalar type with the given element suffix
t<elt> - a vector or tuple type with given element suffix [*1]
+ T<elt> - a vector or tuple type with given element suffix [*2]
v<elt> - a vector with the given element suffix
D<elt> - a 64 bit neon vector
Q<elt> - a 128 bit neon vector
where <elt> has the format described above parse_element_type
[*1] the vectors_per_tuple function indicates whether the type should
- be a tuple, and if so, how many vectors it should contain. */
+ be a tuple, and if so, how many vectors it should contain.
+ [*2] same as for [*1], but the tuple contains half as many vectors.
+*/
static tree
parse_type (const function_instance &instance, const char *&format)
{
unsigned int num_vectors = instance.vectors_per_tuple ();
return acle_vector_types[num_vectors - 1][vector_type];
}
+ if (ch == 'T')
+ {
+ type_suffix_index suffix = parse_element_type (instance, format);
+ vector_type_index vector_type = type_suffixes[suffix].vector_type;
+ unsigned int num_vectors = instance.vectors_per_tuple () / 2;
+ return acle_vector_types[num_vectors - 1][vector_type];
+ }
if (ch == 'v')
{
}
};
+/* LUTI4 (four registers, 8-bit)
+ Variants are also available for: _u8
+ svint8x4_t svluti4_zt_s8_x4 (uint64_t zt0, svuint8x2_t zn)
+ __arm_streaming __arm_in ("zt0"); */
+template <unsigned int BITS> struct luti_zt_base : public nonoverloaded_base
+{
+ void build (function_builder &b,
+ const function_group_info &group) const override
+ {
+ build_all (b, "t0,su64,Tu0", group, MODE_none);
+ }
+
+ bool check (function_checker &c) const override
+ {
+ return c.require_immediate_range (0, 0, 0);
+ }
+};
+
/* sv<t0>_t svfoo[_t0](sv<t0>_t, sv<t0:quarter>_t,
sv<t0:quarter>_t) (for integer t0)
sv<t0>_t svmmla[_t0](sv<t0>_t, sv<t0>_t, sv<t0>_t) (for floating-point t0)
using luti4_lane_zt_def = luti_lane_zt_base<4>;
SHAPE (luti4_lane_zt)
+using luti4_zt_def = luti_zt_base<4>;
+SHAPE (luti4_zt)
+
/* svbool_t svfoo(enum svpattern). */
struct pattern_pred_def : public nonoverloaded_base
{
};
SHAPE (write_za_slice)
+/* MOVT (vector to table)
+ Variants are also available for:
+ [_s8], [_u16], [_s16], [_u32], [_s32], [_u64], [_s64]
+ [_bf16], [_f16], [_f32], [_f64]
+ void svwrite_zt[_u8] (uint64_t zt0, svuint8_t zt, uint64_t idx)
+ __arm_streaming __arm_out ("zt0"); */
+struct write_zt_def : public overloaded_base<0>
+{
+ void build (function_builder &b,
+ const function_group_info &group) const override
+ {
+ b.add_overloaded_functions (group, MODE_none);
+ build_all (b, "_,su64,v0", group, MODE_none);
+ }
+
+ tree resolve (function_resolver &r) const override
+ {
+ sve_type type;
+
+ if (!r.check_num_arguments (2)
+ || !r.require_scalar_type (0, "uint64_t")
+ || !r.require_integer_immediate (0)
+ || !(type = r.infer_vector_type (1)))
+ return error_mark_node;
+
+ return r.resolve_to (r.mode_suffix_id, type);
+ }
+
+ bool check (function_checker &c) const override
+ {
+ return c.require_immediate_range (0, 0, 0);
+ }
+};
+SHAPE (write_zt);
+
+/* MOVT (vector to table)
+ Variants are also available for:
+ [_s8], [_u16], [_s16], [_u32], [_s32], [_u64], [_s64]
+ [_bf16], [_f16], [_f32], [_f64]
+ void svwrite_lane_zt[_u8] (uint64_t zt0, svuint8_t zt, uint64_t idx)
+ __arm_streaming __arm_out ("zt0"); */
+struct write_lane_zt_def : public overloaded_base<0>
+{
+ void build (function_builder &b,
+ const function_group_info &group) const override
+ {
+ b.add_overloaded_functions (group, MODE_none);
+ build_all (b, "_,su64,v0,su64", group, MODE_none);
+ }
+
+ tree resolve (function_resolver &r) const override
+ {
+ sve_type type;
+
+ if (!r.check_num_arguments (3)
+ || !r.require_scalar_type (0, "uint64_t")
+ || !r.require_integer_immediate (0)
+ || !(type = r.infer_vector_type (1))
+ || !r.require_scalar_type (2, "uint64_t"))
+ return error_mark_node;
+
+ return r.resolve_to (r.mode_suffix_id, type);
+ }
+
+ bool check (function_checker &c) const override
+ {
+ return c.require_immediate_range (0, 0, 0)
+ && c.require_immediate_range (2, 0, 3);
+ }
+};
+SHAPE (write_lane_zt);
}
extern const function_shape *const luti4;
extern const function_shape *const luti2_lane_zt;
extern const function_shape *const luti4_lane_zt;
+ extern const function_shape *const luti4_zt;
extern const function_shape *const mmla;
extern const function_shape *const pattern_pred;
extern const function_shape *const pmov_from_vector;
extern const function_shape *const write_za;
extern const function_shape *const write_za_m;
extern const function_shape *const write_za_slice;
+ extern const function_shape *const write_zt;
+ extern const function_shape *const write_lane_zt;
}
}
unsigned int m_bits;
};
+/* LUTI4 (four registers, 8-bit)
+ Variants are also available for: _u8
+ svint8x4_t svluti4_zt_s8_x4 (uint64_t zt0, svuint8x2_t zn)
+ __arm_streaming __arm_in ("zt0"); */
+class svluti_zt_impl : public read_zt0<function_base>
+{
+public:
+ CONSTEXPR svluti_zt_impl (unsigned int bits) : m_bits (bits) {}
+
+ unsigned int call_properties (const function_instance &) const override
+ {
+ return CP_READ_ZT0;
+ }
+
+ rtx expand (function_expander &e) const override
+ {
+ // Remove `zt0` argument, since it is ignored.
+ e.args.ordered_remove (0);
+ return e.use_exact_insn (CODE_FOR_aarch64_sme_lut_zt);
+ }
+
+ unsigned int m_bits;
+};
+
template<insn_code (*CODE) (machine_mode)>
class svread_za_slice_base : public function_base
{
}
};
+/* MOVT (vector to table)
+ Variants are also available for:
+ [_s8], [_u16], [_s16], [_u32], [_s32], [_u64], [_s64]
+ [_bf16], [_f16], [_f32], [_f64]
+ void svwrite_lane_zt[_u8] (uint64_t zt0, svuint8_t zt, uint64_t idx)
+ __arm_streaming __arm_out ("zt0"); */
+class svwrite_lane_zt_impl : public function_base
+{
+public:
+ unsigned int call_properties (const function_instance &) const override
+ {
+ return CP_WRITE_ZT0;
+ }
+
+ rtx expand (function_expander &e) const override
+ {
+ // Remove `zt0` argument, since it is ignored.
+ e.args.ordered_remove (0);
+ auto mode = e.args[0]->mode;
+ return e.use_exact_insn (code_for_aarch64_sme_write_zt (mode));
+ }
+};
+
+/* MOVT (vector to table)
+ Variants are also available for:
+ [_s8], [_u16], [_s16], [_u32], [_s32], [_u64], [_s64]
+ [_bf16], [_f16], [_f32], [_f64]
+ void svwrite_zt[_u8] (uint64_t zt0, svuint8_t zt)
+ __arm_streaming __arm_out ("zt0"); */
+class svwrite_zt_impl : public function_base
+{
+public:
+ unsigned int call_properties (const function_instance &) const override
+ {
+ return CP_WRITE_ZT0;
+ }
+
+ rtx expand (function_expander &e) const override
+ {
+ // svwrite_zt (zt0, zt) == svwrite_lane_zt (zt0, zt, 0)
+ e.args.safe_push (const0_rtx);
+ return svwrite_lane_zt_impl ().expand (e);
+ }
+};
+
using svwrite_za_tile_impl = add_call_properties<read_write_za_base,
CP_READ_ZA | CP_WRITE_ZA>;
FUNCTION (svldr_zt, svldr_zt_impl, )
FUNCTION (svluti2_lane_zt, svluti_lane_zt_impl, (2))
FUNCTION (svluti4_lane_zt, svluti_lane_zt_impl, (4))
+FUNCTION (svluti4_zt, svluti_zt_impl, (4))
FUNCTION (svmla_za, sme_2mode_function, (UNSPEC_SME_SMLA, UNSPEC_SME_UMLA,
UNSPEC_SME_FMLA))
FUNCTION (svmla_lane_za, sme_2mode_lane_function, (UNSPEC_SME_SMLA,
FUNCTION (svwrite_za, svwrite_za_impl,)
FUNCTION (svwrite_hor_za, svwrite_za_tile_impl, (UNSPEC_SME_WRITE_HOR))
FUNCTION (svwrite_ver_za, svwrite_za_tile_impl, (UNSPEC_SME_WRITE_VER))
+FUNCTION (svwrite_zt, svwrite_zt_impl,)
+FUNCTION (svwrite_lane_zt, svwrite_lane_zt_impl,)
FUNCTION (svzero_mask_za, svzero_mask_za_impl, )
FUNCTION (svzero_za, svzero_za_impl, )
FUNCTION (svzero_zt, svzero_zt_impl, )
DEF_SME_ZA_FUNCTION_GS (svzero, inherent_za_slice, d_za, vg4, none)
#undef REQUIRED_EXTENSIONS
+#define REQUIRED_EXTENSIONS streaming_only (AARCH64_FL_SME_LUTv2)
+DEF_SME_FUNCTION_GS (svwrite_zt, write_zt, all_data, none, none)
+DEF_SME_FUNCTION_GS (svwrite_lane_zt, write_lane_zt, all_data, none, none)
+DEF_SME_FUNCTION_GS (svluti4_zt, luti4_zt, b_integer, x4, none)
+#undef REQUIRED_EXTENSIONS
+
#undef DEF_SME_ZA_FUNCTION
#undef DEF_SME_ZA_FUNCTION_GS
#undef DEF_SME_FUNCTION
extern const function_base *const svldr_zt;
extern const function_base *const svluti2_lane_zt;
extern const function_base *const svluti4_lane_zt;
+ extern const function_base *const svluti4_zt;
extern const function_base *const svmla_za;
extern const function_base *const svmla_lane_za;
extern const function_base *const svmls_za;
extern const function_base *const svwrite_za;
extern const function_base *const svwrite_hor_za;
extern const function_base *const svwrite_ver_za;
+ extern const function_base *const svwrite_zt;
+ extern const function_base *const svwrite_lane_zt;
extern const function_base *const svundef_za;
extern const function_base *const svvdot_lane_za;
extern const function_base *const svzero_mask_za;
function_shape describes how that instruction has been presented at
the language level.
- The static list of functions uses function_group to describe a group
- of related functions. The function_builder class is responsible for
- expanding this static description into a list of individual functions
+ The static arrays of function_group_info (function_groups,
+ neon_sve_function_groups, sme_function_groups) use function_group to describe
+ a group of related functions. The function_builder class is responsible for
+ expanding these static description into a list of individual functions
and registering the associated built-in functions. function_instance
describes one of these individual functions in terms of the properties
described above.
--- /dev/null
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+/* LUTI4 (four registers, 8-bit)
+ Variants are also available for: _u8
+ svint8x4_t svluti4_zt_s8_x4 (uint64_t zt0, svuint8x2_t zn)
+ __arm_streaming __arm_in ("zt0"); */
+
+#pragma GCC target "+sve2,+sme-lutv2"
+#define SHARED_ZT0
+#include "test_sme2_acle.h"
+
+/*
+** luti4_zt_u8_x4:
+** luti4 {z0.b - z3.b}, zt0, {z0 - z1}
+** ret
+*/
+PROTO (luti4_zt_u8_x4, svuint8x4_t, (svuint8x2_t z0))
+{
+ return svluti4_zt_u8_x4 (0, z0);
+}
+
+/*
+** luti4_zt_s8_x4:
+** luti4 {z0.b - z3.b}, zt0, {z0 - z1}
+** ret
+*/
+PROTO (luti4_zt_s8_x4, svint8x4_t, (svuint8x2_t z0))
+{
+ return svluti4_zt_s8_x4 (0, z0);
+}
--- /dev/null
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+/* MOVT (vector to table)
+ Variants are also available for:
+ [_s8], [_u16], [_s16], [_u32], [_s32], [_u64], [_s64]
+ [_bf16], [_f16], [_f32], [_f64]
+ void svwrite_lane_zt[_u8] (uint64_t zt0, svuint8_t zt, uint64_t idx)
+ __arm_streaming __arm_out ("zt0"); */
+
+#pragma GCC target "+sve2,+sme-lutv2"
+#define SHARED_ZT0
+#include "test_sme2_acle.h"
+
+/*
+** write_lane_zt_u8:
+** movt zt0 \[0, mul vl\], z0
+** movt zt0 \[1, mul vl\], z0
+** movt zt0 \[2, mul vl\], z0
+** movt zt0 \[3, mul vl\], z0
+** ret
+*/
+PROTO (write_lane_zt_u8, void, (svuint8_t z0))
+{
+ svwrite_lane_zt_u8 (0, z0, 0);
+ svwrite_lane_zt_u8 (0, z0, 1);
+ svwrite_lane_zt_u8 (0, z0, 2);
+ svwrite_lane_zt_u8 (0, z0, 3);
+}
+
+/*
+** write_lane_zt_s8:
+** movt zt0 \[0, mul vl\], z0
+** movt zt0 \[1, mul vl\], z0
+** movt zt0 \[2, mul vl\], z0
+** movt zt0 \[3, mul vl\], z0
+** ret
+*/
+PROTO (write_lane_zt_s8, void, (svint8_t z0))
+{
+ svwrite_lane_zt_s8 (0, z0, 0);
+ svwrite_lane_zt_s8 (0, z0, 1);
+ svwrite_lane_zt_s8 (0, z0, 2);
+ svwrite_lane_zt_s8 (0, z0, 3);
+}
+
+/*
+** write_lane_zt_u16:
+** movt zt0 \[0, mul vl\], z0
+** movt zt0 \[1, mul vl\], z0
+** movt zt0 \[2, mul vl\], z0
+** movt zt0 \[3, mul vl\], z0
+** ret
+*/
+PROTO (write_lane_zt_u16, void, (svuint16_t z0))
+{
+ svwrite_lane_zt_u16 (0, z0, 0);
+ svwrite_lane_zt_u16 (0, z0, 1);
+ svwrite_lane_zt_u16 (0, z0, 2);
+ svwrite_lane_zt_u16 (0, z0, 3);
+}
+
+/*
+** write_lane_zt_s16:
+** movt zt0 \[0, mul vl\], z0
+** movt zt0 \[1, mul vl\], z0
+** movt zt0 \[2, mul vl\], z0
+** movt zt0 \[3, mul vl\], z0
+** ret
+*/
+PROTO (write_lane_zt_s16, void, (svint16_t z0))
+{
+ svwrite_lane_zt_s16 (0, z0, 0);
+ svwrite_lane_zt_s16 (0, z0, 1);
+ svwrite_lane_zt_s16 (0, z0, 2);
+ svwrite_lane_zt_s16 (0, z0, 3);
+}
+
+/*
+** write_lane_zt_u32:
+** movt zt0 \[0, mul vl\], z0
+** movt zt0 \[1, mul vl\], z0
+** movt zt0 \[2, mul vl\], z0
+** movt zt0 \[3, mul vl\], z0
+** ret
+*/
+PROTO (write_lane_zt_u32, void, (svuint32_t z0))
+{
+ svwrite_lane_zt_u32 (0, z0, 0);
+ svwrite_lane_zt_u32 (0, z0, 1);
+ svwrite_lane_zt_u32 (0, z0, 2);
+ svwrite_lane_zt_u32 (0, z0, 3);
+}
+
+/*
+** write_lane_zt_s32:
+** movt zt0 \[0, mul vl\], z0
+** movt zt0 \[1, mul vl\], z0
+** movt zt0 \[2, mul vl\], z0
+** movt zt0 \[3, mul vl\], z0
+** ret
+*/
+PROTO (write_lane_zt_s32, void, (svint32_t z0))
+{
+ svwrite_lane_zt_s32 (0, z0, 0);
+ svwrite_lane_zt_s32 (0, z0, 1);
+ svwrite_lane_zt_s32 (0, z0, 2);
+ svwrite_lane_zt_s32 (0, z0, 3);
+}
+
+/*
+** write_lane_zt_u64:
+** movt zt0 \[0, mul vl\], z0
+** movt zt0 \[1, mul vl\], z0
+** movt zt0 \[2, mul vl\], z0
+** movt zt0 \[3, mul vl\], z0
+** ret
+*/
+PROTO (write_lane_zt_u64, void, (svuint64_t z0))
+{
+ svwrite_lane_zt_u64 (0, z0, 0);
+ svwrite_lane_zt_u64 (0, z0, 1);
+ svwrite_lane_zt_u64 (0, z0, 2);
+ svwrite_lane_zt_u64 (0, z0, 3);
+}
+
+/*
+** write_lane_zt_s64:
+** movt zt0 \[0, mul vl\], z0
+** movt zt0 \[1, mul vl\], z0
+** movt zt0 \[2, mul vl\], z0
+** movt zt0 \[3, mul vl\], z0
+** ret
+*/
+PROTO (write_lane_zt_s64, void, (svint64_t z0))
+{
+ svwrite_lane_zt_s64 (0, z0, 0);
+ svwrite_lane_zt_s64 (0, z0, 1);
+ svwrite_lane_zt_s64 (0, z0, 2);
+ svwrite_lane_zt_s64 (0, z0, 3);
+}
+
+/*
+** write_lane_zt_bf16:
+** movt zt0 \[0, mul vl\], z0
+** movt zt0 \[1, mul vl\], z0
+** movt zt0 \[2, mul vl\], z0
+** movt zt0 \[3, mul vl\], z0
+** ret
+*/
+PROTO (write_lane_zt_bf16, void, (svbfloat16_t z0))
+{
+ svwrite_lane_zt_bf16 (0, z0, 0);
+ svwrite_lane_zt_bf16 (0, z0, 1);
+ svwrite_lane_zt_bf16 (0, z0, 2);
+ svwrite_lane_zt_bf16 (0, z0, 3);
+}
+
+/*
+** write_lane_zt_f16:
+** movt zt0 \[0, mul vl\], z0
+** movt zt0 \[1, mul vl\], z0
+** movt zt0 \[2, mul vl\], z0
+** movt zt0 \[3, mul vl\], z0
+** ret
+*/
+PROTO (write_lane_zt_f16, void, (svfloat16_t z0))
+{
+ svwrite_lane_zt_f16 (0, z0, 0);
+ svwrite_lane_zt_f16 (0, z0, 1);
+ svwrite_lane_zt_f16 (0, z0, 2);
+ svwrite_lane_zt_f16 (0, z0, 3);
+}
+
+/*
+** write_lane_zt_f32:
+** movt zt0 \[0, mul vl\], z0
+** movt zt0 \[1, mul vl\], z0
+** movt zt0 \[2, mul vl\], z0
+** movt zt0 \[3, mul vl\], z0
+** ret
+*/
+PROTO (write_lane_zt_f32, void, (svfloat32_t z0))
+{
+ svwrite_lane_zt_f32 (0, z0, 0);
+ svwrite_lane_zt_f32 (0, z0, 1);
+ svwrite_lane_zt_f32 (0, z0, 2);
+ svwrite_lane_zt_f32 (0, z0, 3);
+}
+
+/*
+** write_lane_zt_f64:
+** movt zt0 \[0, mul vl\], z0
+** movt zt0 \[1, mul vl\], z0
+** movt zt0 \[2, mul vl\], z0
+** movt zt0 \[3, mul vl\], z0
+** ret
+*/
+PROTO (write_lane_zt_f64, void, (svfloat64_t z0))
+{
+ svwrite_lane_zt_f64 (0, z0, 0);
+ svwrite_lane_zt_f64 (0, z0, 1);
+ svwrite_lane_zt_f64 (0, z0, 2);
+ svwrite_lane_zt_f64 (0, z0, 3);
+}
--- /dev/null
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+/* MOVT (vector to table)
+ Variants are also available for:
+ [_s8], [_u16], [_s16], [_u32], [_s32], [_u64], [_s64]
+ [_bf16], [_f16], [_f32], [_f64]
+ void svwrite_zt[_u8] (uint64_t zt0, svuint8_t zt, uint64_t idx)
+ __arm_streaming __arm_out ("zt0"); */
+
+#pragma GCC target "+sve2,+sme-lutv2"
+#define SHARED_ZT0
+#include "test_sme2_acle.h"
+
+/*
+** write_zt_u8:
+** movt zt0 \[0, mul vl\], z0
+** ret
+*/
+PROTO (write_zt_u8, void, (svuint8_t z0)) { svwrite_zt_u8 (0, z0); }
+
+/*
+** write_zt_s8:
+** movt zt0 \[0, mul vl\], z0
+** ret
+*/
+PROTO (write_zt_s8, void, (svint8_t z0)) { svwrite_zt_s8 (0, z0); }
+
+/*
+** write_zt_u16:
+** movt zt0 \[0, mul vl\], z0
+** ret
+*/
+PROTO (write_zt_u16, void, (svuint16_t z0)) { svwrite_zt_u16 (0, z0); }
+
+/*
+** write_zt_s16:
+** movt zt0 \[0, mul vl\], z0
+** ret
+*/
+PROTO (write_zt_s16, void, (svint16_t z0)) { svwrite_zt_s16 (0, z0); }
+
+/*
+** write_zt_u32:
+** movt zt0 \[0, mul vl\], z0
+** ret
+*/
+PROTO (write_zt_u32, void, (svuint32_t z0)) { svwrite_zt_u32 (0, z0); }
+
+/*
+** write_zt_s32:
+** movt zt0 \[0, mul vl\], z0
+** ret
+*/
+PROTO (write_zt_s32, void, (svint32_t z0)) { svwrite_zt_s32 (0, z0); }
+
+/*
+** write_zt_u64:
+** movt zt0 \[0, mul vl\], z0
+** ret
+*/
+PROTO (write_zt_u64, void, (svuint64_t z0)) { svwrite_zt_u64 (0, z0); }
+
+/*
+** write_zt_s64:
+** movt zt0 \[0, mul vl\], z0
+** ret
+*/
+PROTO (write_zt_s64, void, (svint64_t z0)) { svwrite_zt_s64 (0, z0); }
+
+/*
+** write_zt_bf16:
+** movt zt0 \[0, mul vl\], z0
+** ret
+*/
+PROTO (write_zt_bf16, void, (svbfloat16_t z0)) { svwrite_zt_bf16 (0, z0); }
+
+/*
+** write_zt_f16:
+** movt zt0 \[0, mul vl\], z0
+** ret
+*/
+PROTO (write_zt_f16, void, (svfloat16_t z0)) { svwrite_zt_f16 (0, z0); }
+
+/*
+** write_zt_f32:
+** movt zt0 \[0, mul vl\], z0
+** ret
+*/
+PROTO (write_zt_f32, void, (svfloat32_t z0)) { svwrite_zt_f32 (0, z0); }
+
+/*
+** write_zt_f64:
+** movt zt0 \[0, mul vl\], z0
+** ret
+*/
+PROTO (write_zt_f64, void, (svfloat64_t z0)) { svwrite_zt_f64 (0, z0); }
--- /dev/null
+/* { dg-options "-std=c23" } */
+/* { dg-do compile } */
+
+#pragma GCC target "+sve2,+sme-lutv2"
+static_assert (__ARM_FEATURE_SME_LUTv2 == 1);
+#include <arm_sme.h>
+
+/* LUTI4 (four registers, 8-bit)
+ Variants are also available for: _u8
+ svint8x4_t svluti4_zt_s8_x4 (uint64_t zt0, svuint8x2_t zn)
+ __arm_streaming __arm_in ("zt0"); */
+
+void
+test_svluti4_zt_ok (svuint8x2_t zn_u8) __arm_streaming __arm_in ("zt0")
+{
+ svluti4_zt_s8_x4 (0, zn_u8);
+ svluti4_zt_u8_x4 (0, zn_u8);
+}
+
+void
+test_svluti4_zt_not_streaming (svuint8x2_t zn_u8)
+{
+ svluti4_zt_s8_x4 (0, zn_u8); /* { dg-error {ACLE function 'svluti4_zt_s8_x4' can only be called when SME streaming mode is enabled} } */
+ svluti4_zt_u8_x4 (0, zn_u8); /* { dg-error {ACLE function 'svluti4_zt_u8_x4' can only be called when SME streaming mode is enabled} } */
+}
+
+void
+test_svluti4_zt_streaming_compatible (svuint8x2_t zn_u8) __arm_streaming_compatible
+{
+ svluti4_zt_s8_x4 (0, zn_u8); /* { dg-error {ACLE function 'svluti4_zt_s8_x4' can only be called when SME streaming mode is enabled} } */
+ svluti4_zt_u8_x4 (0, zn_u8); /* { dg-error {ACLE function 'svluti4_zt_u8_x4' can only be called when SME streaming mode is enabled} } */
+}
+
+void
+test_svluti4_zt_arg_count_mismatch (svuint8x2_t zn_u8) __arm_streaming __arm_in ("zt0")
+{
+ svluti4_zt_s8_x4 (); /* { dg-error {too few arguments to function 'svluti4_zt_s8_x4'; expected 2, have 0} } */
+ svluti4_zt_u8_x4 (); /* { dg-error {too few arguments to function 'svluti4_zt_u8_x4'; expected 2, have 0} } */
+
+ svluti4_zt_s8_x4 (0); /* { dg-error {too few arguments to function 'svluti4_zt_s8_x4'; expected 2, have 1} } */
+ svluti4_zt_u8_x4 (0); /* { dg-error {too few arguments to function 'svluti4_zt_u8_x4'; expected 2, have 1} } */
+
+ svluti4_zt_s8_x4 (0, zn_u8, 0); /* { dg-error {too many arguments to function 'svluti4_zt_s8_x4'; expected 2, have 3} } */
+ svluti4_zt_u8_x4 (0, zn_u8, 0); /* { dg-error {too many arguments to function 'svluti4_zt_u8_x4'; expected 2, have 3} } */
+}
+
+void
+test_svluti4_zt_arg_type_mismatch (svuint8x2_t zn_u8) __arm_streaming __arm_in ("zt0")
+{
+ struct Foo { uint64_t val; } foo = {0};
+ svluti4_zt_s8_x4 (foo, zn_u8); /* { dg-error {incompatible type for argument 1 of 'svluti4_zt_s8_x4'} } */
+ svluti4_zt_u8_x4 (foo, zn_u8); /* { dg-error {incompatible type for argument 1 of 'svluti4_zt_u8_x4'} } */
+}
+
+void
+test_svluti4_zt_ret_type_mismatch (svuint8x2_t zn_u8) __arm_streaming __arm_in ("zt0")
+{
+ int x0 = svluti4_zt_s8_x4 (0, zn_u8); /* { dg-error {incompatible types when initializing type 'int' using type 'svint8x4_t'} } */
+ int x1 = svluti4_zt_u8_x4 (0, zn_u8); /* { dg-error {incompatible types when initializing type 'int' using type 'svuint8x4_t'} } */
+}
+
+void
+test_svluti4_zt_zt0_not_immediate (uint64_t zt0, svuint8x2_t zn_u8) __arm_streaming __arm_in ("zt0")
+{
+ svluti4_zt_s8_x4 (zt0, zn_u8); /* { dg-error {argument 1 of 'svluti4_zt_s8_x4' must be an integer constant expression} } */
+ svluti4_zt_u8_x4 (zt0, zn_u8); /* { dg-error {argument 1 of 'svluti4_zt_u8_x4' must be an integer constant expression} } */
+}
+
+void
+test_svluti4_zt_zt0_not_in_range (uint64_t zt0, svuint8x2_t zn_u8)__arm_streaming __arm_in ("zt0")
+{
+ svluti4_zt_s8_x4 (1, zn_u8); /* { dg-error {passing 1 to argument 1 of 'svluti4_zt_s8_x4', which expects the value 0} } */
+ svluti4_zt_u8_x4 (1, zn_u8); /* { dg-error {passing 1 to argument 1 of 'svluti4_zt_u8_x4', which expects the value 0} } */
+
+ svluti4_zt_s8_x4 (-1, zn_u8); /* { dg-error {passing -1 to argument 1 of 'svluti4_zt_s8_x4', which expects the value 0} } */
+ svluti4_zt_u8_x4 (-1, zn_u8); /* { dg-error {passing -1 to argument 1 of 'svluti4_zt_u8_x4', which expects the value 0} } */
+}
+
+#pragma GCC reset_options
+#pragma GCC target("+sve2,+sme2")
+void
+test_svluti4_zt_feature_not_enabled (svuint8x2_t zn_u8)__arm_streaming __arm_in ("zt0")
+{
+ // GCC only complains for the first such instance, so only one test here.
+ svluti4_zt_s8_x4 (0, zn_u8); /* { dg-error {ACLE function 'svluti4_zt_s8_x4' requires ISA extension 'sme-lutv2'} } */
+}
--- /dev/null
+/* { dg-options "-std=c23" } */
+/* { dg-do compile } */
+
+/* MOVT (vector to table)
+ Variants are also available for:
+ [_s8], [_u16], [_s16], [_u32], [_s32], [_u64], [_s64]
+ [_bf16], [_f16], [_f32], [_f64]
+ void svwrite_lane_zt[_u8] (uint64_t zt0, svuint8_t zt, uint64_t idx)
+ __arm_streaming __arm_out ("zt0"); */
+
+#pragma GCC target "+sve2,+sme-lutv2"
+static_assert (__ARM_FEATURE_SME_LUTv2 == 1);
+#include <arm_sme.h>
+
+void
+test_svwrite_lane_zt_explicit_ok (
+ svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16, svint16_t zt_s16,
+ svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64, svint64_t zt_s64,
+ svbfloat16_t zt_bf16, svfloat16_t zt_f16, svfloat32_t zt_f32,
+ svfloat64_t zt_f64) __arm_streaming __arm_inout ("zt0")
+{
+ svwrite_lane_zt_u8 (0, zt_u8, 0);
+ svwrite_lane_zt_s8 (0, zt_s8, 0);
+ svwrite_lane_zt_u16 (0, zt_u16, 0);
+ svwrite_lane_zt_s16 (0, zt_s16, 0);
+ svwrite_lane_zt_u32 (0, zt_u32, 0);
+ svwrite_lane_zt_s32 (0, zt_s32, 0);
+ svwrite_lane_zt_u64 (0, zt_u64, 0);
+ svwrite_lane_zt_s64 (0, zt_s64, 0);
+ svwrite_lane_zt_bf16 (0, zt_bf16, 0);
+ svwrite_lane_zt_f16 (0, zt_f16, 0);
+ svwrite_lane_zt_f32 (0, zt_f32, 0);
+ svwrite_lane_zt_f64 (0, zt_f64, 0);
+}
+
+void
+test_svwrite_lane_zt_inferred_ok (
+ svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16, svint16_t zt_s16,
+ svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64, svint64_t zt_s64,
+ svbfloat16_t zt_bf16, svfloat16_t zt_f16, svfloat32_t zt_f32,
+ svfloat64_t zt_f64) __arm_streaming __arm_inout ("zt0")
+{
+ svwrite_lane_zt (0, zt_u8, 0);
+ svwrite_lane_zt (0, zt_s8, 0);
+ svwrite_lane_zt (0, zt_u16, 0);
+ svwrite_lane_zt (0, zt_s16, 0);
+ svwrite_lane_zt (0, zt_u32, 0);
+ svwrite_lane_zt (0, zt_s32, 0);
+ svwrite_lane_zt (0, zt_u64, 0);
+ svwrite_lane_zt (0, zt_s64, 0);
+ svwrite_lane_zt (0, zt_bf16, 0);
+ svwrite_lane_zt (0, zt_f16, 0);
+ svwrite_lane_zt (0, zt_f32, 0);
+ svwrite_lane_zt (0, zt_f64, 0);
+}
+
+void
+test_svwrite_lane_zt_explicit_error_not_streaming (
+ svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16, svint16_t zt_s16,
+ svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64, svint64_t zt_s64,
+ svbfloat16_t zt_bf16, svfloat16_t zt_f16, svfloat32_t zt_f32,
+ svfloat64_t zt_f64)
+{
+ svwrite_lane_zt_u8 (0, zt_u8, 0); /* { dg-error {ACLE function 'svwrite_lane_zt_u8' can only be called when SME streaming mode is enabled} } */
+ svwrite_lane_zt_s8 (0, zt_s8, 0); /* { dg-error {ACLE function 'svwrite_lane_zt_s8' can only be called when SME streaming mode is enabled} } */
+ svwrite_lane_zt_u16 (0, zt_u16, 0); /* { dg-error {ACLE function 'svwrite_lane_zt_u16' can only be called when SME streaming mode is enabled} } */
+ svwrite_lane_zt_s16 (0, zt_s16, 0); /* { dg-error {ACLE function 'svwrite_lane_zt_s16' can only be called when SME streaming mode is enabled} } */
+ svwrite_lane_zt_u32 (0, zt_u32, 0); /* { dg-error {ACLE function 'svwrite_lane_zt_u32' can only be called when SME streaming mode is enabled} } */
+ svwrite_lane_zt_s32 (0, zt_s32, 0); /* { dg-error {ACLE function 'svwrite_lane_zt_s32' can only be called when SME streaming mode is enabled} } */
+ svwrite_lane_zt_u64 (0, zt_u64, 0); /* { dg-error {ACLE function 'svwrite_lane_zt_u64' can only be called when SME streaming mode is enabled} } */
+ svwrite_lane_zt_s64 (0, zt_s64, 0); /* { dg-error {ACLE function 'svwrite_lane_zt_s64' can only be called when SME streaming mode is enabled} } */
+ svwrite_lane_zt_bf16 (0, zt_bf16, 0); /* { dg-error {ACLE function 'svwrite_lane_zt_bf16' can only be called when SME streaming mode is enabled} } */
+ svwrite_lane_zt_f16 (0, zt_f16, 0); /* { dg-error {ACLE function 'svwrite_lane_zt_f16' can only be called when SME streaming mode is enabled} } */
+ svwrite_lane_zt_f32 (0, zt_f32, 0); /* { dg-error {ACLE function 'svwrite_lane_zt_f32' can only be called when SME streaming mode is enabled} } */
+ svwrite_lane_zt_f64 (0, zt_f64, 0); /* { dg-error {ACLE function 'svwrite_lane_zt_f64' can only be called when SME streaming mode is enabled} } */
+}
+
+void
+test_svwrite_lane_zt_inferred_error_not_streaming (
+ svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16, svint16_t zt_s16,
+ svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64, svint64_t zt_s64,
+ svbfloat16_t zt_bf16, svfloat16_t zt_f16, svfloat32_t zt_f32,
+ svfloat64_t zt_f64)
+{
+ svwrite_lane_zt (0, zt_u8, 0); /* { dg-error {ACLE function 'svwrite_lane_zt_u8' can only be called when SME streaming mode is enabled} } */
+ svwrite_lane_zt (0, zt_s8, 0); /* { dg-error {ACLE function 'svwrite_lane_zt_s8' can only be called when SME streaming mode is enabled} } */
+ svwrite_lane_zt (0, zt_u16, 0); /* { dg-error {ACLE function 'svwrite_lane_zt_u16' can only be called when SME streaming mode is enabled} } */
+ svwrite_lane_zt (0, zt_s16, 0); /* { dg-error {ACLE function 'svwrite_lane_zt_s16' can only be called when SME streaming mode is enabled} } */
+ svwrite_lane_zt (0, zt_u32, 0); /* { dg-error {ACLE function 'svwrite_lane_zt_u32' can only be called when SME streaming mode is enabled} } */
+ svwrite_lane_zt (0, zt_s32, 0); /* { dg-error {ACLE function 'svwrite_lane_zt_s32' can only be called when SME streaming mode is enabled} } */
+ svwrite_lane_zt (0, zt_u64, 0); /* { dg-error {ACLE function 'svwrite_lane_zt_u64' can only be called when SME streaming mode is enabled} } */
+ svwrite_lane_zt (0, zt_s64, 0); /* { dg-error {ACLE function 'svwrite_lane_zt_s64' can only be called when SME streaming mode is enabled} } */
+ svwrite_lane_zt (0, zt_bf16, 0); /* { dg-error {ACLE function 'svwrite_lane_zt_bf16' can only be called when SME streaming mode is enabled} } */
+ svwrite_lane_zt (0, zt_f16, 0); /* { dg-error {ACLE function 'svwrite_lane_zt_f16' can only be called when SME streaming mode is enabled} } */
+ svwrite_lane_zt (0, zt_f32, 0); /* { dg-error {ACLE function 'svwrite_lane_zt_f32' can only be called when SME streaming mode is enabled} } */
+ svwrite_lane_zt (0, zt_f64, 0); /* { dg-error {ACLE function 'svwrite_lane_zt_f64' can only be called when SME streaming mode is enabled} } */
+}
+
+void
+test_svwrite_lane_zt_explicit_error_arg_count_mismatch (
+ svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16, svint16_t zt_s16,
+ svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64, svint64_t zt_s64,
+ svbfloat16_t zt_bf16, svfloat16_t zt_f16, svfloat32_t zt_f32,
+ svfloat64_t zt_f64) __arm_streaming __arm_out ("zt0")
+{
+ svwrite_lane_zt_u8 (); /* { dg-error {too few arguments to function 'svwrite_lane_zt_u8'; expected 3, have 0} } */
+ svwrite_lane_zt_s8 (); /* { dg-error {too few arguments to function 'svwrite_lane_zt_s8'; expected 3, have 0} } */
+ svwrite_lane_zt_u16 (); /* { dg-error {too few arguments to function 'svwrite_lane_zt_u16'; expected 3, have 0} } */
+ svwrite_lane_zt_s16 (); /* { dg-error {too few arguments to function 'svwrite_lane_zt_s16'; expected 3, have 0} } */
+ svwrite_lane_zt_u32 (); /* { dg-error {too few arguments to function 'svwrite_lane_zt_u32'; expected 3, have 0} } */
+ svwrite_lane_zt_s32 (); /* { dg-error {too few arguments to function 'svwrite_lane_zt_s32'; expected 3, have 0} } */
+ svwrite_lane_zt_u64 (); /* { dg-error {too few arguments to function 'svwrite_lane_zt_u64'; expected 3, have 0} } */
+ svwrite_lane_zt_s64 (); /* { dg-error {too few arguments to function 'svwrite_lane_zt_s64'; expected 3, have 0} } */
+ svwrite_lane_zt_bf16 (); /* { dg-error {too few arguments to function 'svwrite_lane_zt_bf16'; expected 3, have 0} } */
+ svwrite_lane_zt_f16 (); /* { dg-error {too few arguments to function 'svwrite_lane_zt_f16'; expected 3, have 0} } */
+ svwrite_lane_zt_f32 (); /* { dg-error {too few arguments to function 'svwrite_lane_zt_f32'; expected 3, have 0} } */
+ svwrite_lane_zt_f64 (); /* { dg-error {too few arguments to function 'svwrite_lane_zt_f64'; expected 3, have 0} } */
+
+ svwrite_lane_zt_u8 (0); /* { dg-error {too few arguments to function 'svwrite_lane_zt_u8'; expected 3, have 1} } */
+ svwrite_lane_zt_s8 (0); /* { dg-error {too few arguments to function 'svwrite_lane_zt_s8'; expected 3, have 1} } */
+ svwrite_lane_zt_u16 (0); /* { dg-error {too few arguments to function 'svwrite_lane_zt_u16'; expected 3, have 1} } */
+ svwrite_lane_zt_s16 (0); /* { dg-error {too few arguments to function 'svwrite_lane_zt_s16'; expected 3, have 1} } */
+ svwrite_lane_zt_u32 (0); /* { dg-error {too few arguments to function 'svwrite_lane_zt_u32'; expected 3, have 1} } */
+ svwrite_lane_zt_s32 (0); /* { dg-error {too few arguments to function 'svwrite_lane_zt_s32'; expected 3, have 1} } */
+ svwrite_lane_zt_u64 (0); /* { dg-error {too few arguments to function 'svwrite_lane_zt_u64'; expected 3, have 1} } */
+ svwrite_lane_zt_s64 (0); /* { dg-error {too few arguments to function 'svwrite_lane_zt_s64'; expected 3, have 1} } */
+ svwrite_lane_zt_bf16 (0); /* { dg-error {too few arguments to function 'svwrite_lane_zt_bf16'; expected 3, have 1} } */
+ svwrite_lane_zt_f16 (0); /* { dg-error {too few arguments to function 'svwrite_lane_zt_f16'; expected 3, have 1} } */
+ svwrite_lane_zt_f32 (0); /* { dg-error {too few arguments to function 'svwrite_lane_zt_f32'; expected 3, have 1} } */
+ svwrite_lane_zt_f64 (0); /* { dg-error {too few arguments to function 'svwrite_lane_zt_f64'; expected 3, have 1} } */
+
+ svwrite_lane_zt_u8 (0, zt_u8); /* { dg-error {too few arguments to function 'svwrite_lane_zt_u8'; expected 3, have 2} } */
+ svwrite_lane_zt_s8 (0, zt_s8); /* { dg-error {too few arguments to function 'svwrite_lane_zt_s8'; expected 3, have 2} } */
+ svwrite_lane_zt_u16 (0, zt_u16); /* { dg-error {too few arguments to function 'svwrite_lane_zt_u16'; expected 3, have 2} } */
+ svwrite_lane_zt_s16 (0, zt_s16); /* { dg-error {too few arguments to function 'svwrite_lane_zt_s16'; expected 3, have 2} } */
+ svwrite_lane_zt_u32 (0, zt_u32); /* { dg-error {too few arguments to function 'svwrite_lane_zt_u32'; expected 3, have 2} } */
+ svwrite_lane_zt_s32 (0, zt_s32); /* { dg-error {too few arguments to function 'svwrite_lane_zt_s32'; expected 3, have 2} } */
+ svwrite_lane_zt_u64 (0, zt_u64); /* { dg-error {too few arguments to function 'svwrite_lane_zt_u64'; expected 3, have 2} } */
+ svwrite_lane_zt_s64 (0, zt_s64); /* { dg-error {too few arguments to function 'svwrite_lane_zt_s64'; expected 3, have 2} } */
+ svwrite_lane_zt_bf16 (0, zt_bf16); /* { dg-error {too few arguments to function 'svwrite_lane_zt_bf16'; expected 3, have 2} } */
+ svwrite_lane_zt_f16 (0, zt_f16); /* { dg-error {too few arguments to function 'svwrite_lane_zt_f16'; expected 3, have 2} } */
+ svwrite_lane_zt_f32 (0, zt_f32); /* { dg-error {too few arguments to function 'svwrite_lane_zt_f32'; expected 3, have 2} } */
+ svwrite_lane_zt_f64 (0, zt_f64); /* { dg-error {too few arguments to function 'svwrite_lane_zt_f64'; expected 3, have 2} } */
+
+ svwrite_lane_zt_u8 (0, zt_u8, 0, 0); /* { dg-error {too many arguments to function 'svwrite_lane_zt_u8'; expected 3, have 4} } */
+ svwrite_lane_zt_s8 (0, zt_s8, 0, 0); /* { dg-error {too many arguments to function 'svwrite_lane_zt_s8'; expected 3, have 4} } */
+ svwrite_lane_zt_u16 (0, zt_u16, 0, 0); /* { dg-error {too many arguments to function 'svwrite_lane_zt_u16'; expected 3, have 4} } */
+ svwrite_lane_zt_s16 (0, zt_s16, 0, 0); /* { dg-error {too many arguments to function 'svwrite_lane_zt_s16'; expected 3, have 4} } */
+ svwrite_lane_zt_u32 (0, zt_u32, 0, 0); /* { dg-error {too many arguments to function 'svwrite_lane_zt_u32'; expected 3, have 4} } */
+ svwrite_lane_zt_s32 (0, zt_s32, 0, 0); /* { dg-error {too many arguments to function 'svwrite_lane_zt_s32'; expected 3, have 4} } */
+ svwrite_lane_zt_u64 (0, zt_u64, 0, 0); /* { dg-error {too many arguments to function 'svwrite_lane_zt_u64'; expected 3, have 4} } */
+ svwrite_lane_zt_s64 (0, zt_s64, 0, 0); /* { dg-error {too many arguments to function 'svwrite_lane_zt_s64'; expected 3, have 4} } */
+ svwrite_lane_zt_bf16 (0, zt_bf16, 0, 0); /* { dg-error {too many arguments to function 'svwrite_lane_zt_bf16'; expected 3, have 4} } */
+ svwrite_lane_zt_f16 (0, zt_f16, 0, 0); /* { dg-error {too many arguments to function 'svwrite_lane_zt_f16'; expected 3, have 4} } */
+ svwrite_lane_zt_f32 (0, zt_f32, 0, 0); /* { dg-error {too many arguments to function 'svwrite_lane_zt_f32'; expected 3, have 4} } */
+ svwrite_lane_zt_f64 (0, zt_f64, 0, 0); /* { dg-error {too many arguments to function 'svwrite_lane_zt_f64'; expected 3, have 4} } */
+}
+
+void
+test_svwrite_lane_zt_implicit_error_arg_count_mismatch (
+ svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16, svint16_t zt_s16,
+ svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64, svint64_t zt_s64,
+ svbfloat16_t zt_bf16, svfloat16_t zt_f16, svfloat32_t zt_f32,
+ svfloat64_t zt_f64) __arm_streaming __arm_out ("zt0")
+{
+ svwrite_lane_zt (); /* { dg-error {too few arguments to function 'svwrite_lane_zt'} } */
+ svwrite_lane_zt (0); /* { dg-error {too few arguments to function 'svwrite_lane_zt'} } */
+ svwrite_lane_zt (0, zt_u8); /* { dg-error {too few arguments to function 'svwrite_lane_zt'} } */
+ svwrite_lane_zt (0, zt_s8); /* { dg-error {too few arguments to function 'svwrite_lane_zt'} } */
+ svwrite_lane_zt (0, zt_u16); /* { dg-error {too few arguments to function 'svwrite_lane_zt'} } */
+ svwrite_lane_zt (0, zt_s16); /* { dg-error {too few arguments to function 'svwrite_lane_zt'} } */
+ svwrite_lane_zt (0, zt_u32); /* { dg-error {too few arguments to function 'svwrite_lane_zt'} } */
+ svwrite_lane_zt (0, zt_s32); /* { dg-error {too few arguments to function 'svwrite_lane_zt'} } */
+ svwrite_lane_zt (0, zt_u64); /* { dg-error {too few arguments to function 'svwrite_lane_zt'} } */
+ svwrite_lane_zt (0, zt_s64); /* { dg-error {too few arguments to function 'svwrite_lane_zt'} } */
+ svwrite_lane_zt (0, zt_bf16); /* { dg-error {too few arguments to function 'svwrite_lane_zt'} } */
+ svwrite_lane_zt (0, zt_f16); /* { dg-error {too few arguments to function 'svwrite_lane_zt'} } */
+ svwrite_lane_zt (0, zt_f32); /* { dg-error {too few arguments to function 'svwrite_lane_zt'} } */
+ svwrite_lane_zt (0, zt_f64); /* { dg-error {too few arguments to function 'svwrite_lane_zt'} } */
+
+ svwrite_lane_zt (0, zt_u8, 0, 0); /* { dg-error {too many arguments to function 'svwrite_lane_zt'} } */
+ svwrite_lane_zt (0, zt_s8, 0, 0); /* { dg-error {too many arguments to function 'svwrite_lane_zt'} } */
+ svwrite_lane_zt (0, zt_u16, 0, 0); /* { dg-error {too many arguments to function 'svwrite_lane_zt'} } */
+ svwrite_lane_zt (0, zt_s16, 0, 0); /* { dg-error {too many arguments to function 'svwrite_lane_zt'} } */
+ svwrite_lane_zt (0, zt_u32, 0, 0); /* { dg-error {too many arguments to function 'svwrite_lane_zt'} } */
+ svwrite_lane_zt (0, zt_s32, 0, 0); /* { dg-error {too many arguments to function 'svwrite_lane_zt'} } */
+ svwrite_lane_zt (0, zt_u64, 0, 0); /* { dg-error {too many arguments to function 'svwrite_lane_zt'} } */
+ svwrite_lane_zt (0, zt_s64, 0, 0); /* { dg-error {too many arguments to function 'svwrite_lane_zt'} } */
+ svwrite_lane_zt (0, zt_bf16, 0, 0); /* { dg-error {too many arguments to function 'svwrite_lane_zt'} } */
+ svwrite_lane_zt (0, zt_f16, 0, 0); /* { dg-error {too many arguments to function 'svwrite_lane_zt'} } */
+ svwrite_lane_zt (0, zt_f32, 0, 0); /* { dg-error {too many arguments to function 'svwrite_lane_zt'} } */
+ svwrite_lane_zt (0, zt_f64, 0, 0); /* { dg-error {too many arguments to function 'svwrite_lane_zt'} } */
+}
+
+void
+test_svwrite_lane_zt_explicit_error_arg_type_mismatch (
+ svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16, svint16_t zt_s16,
+ svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64, svint64_t zt_s64,
+ svbfloat16_t zt_bf16, svfloat16_t zt_f16, svfloat32_t zt_f32,
+ svfloat64_t zt_f64, svuint8x2_t zt_u8x2, svint8x2_t zt_s8x2,
+ svuint16x2_t zt_u16x2, svint16x2_t zt_s16x2, svuint32x2_t zt_u32x2,
+ svint32x2_t zt_s32x2, svuint64x2_t zt_u64x2, svint64x2_t zt_s64x2,
+ svbfloat16x2_t zt_bf16x2, svfloat16x2_t zt_f16x2, svfloat32x2_t zt_f32x2,
+ svfloat64x2_t zt_f64x2) __arm_streaming __arm_out ("zt0")
+{
+ struct Foo { uint64_t val; } foo = {0};
+ svwrite_lane_zt_u8 (foo, zt_u8, 0); /* { dg-error {incompatible type for argument 1 of 'svwrite_lane_zt_u8'} } */
+ svwrite_lane_zt_s8 (foo, zt_s8, 0); /* { dg-error {incompatible type for argument 1 of 'svwrite_lane_zt_s8'} } */
+ svwrite_lane_zt_u16 (foo, zt_u16, 0); /* { dg-error {incompatible type for argument 1 of 'svwrite_lane_zt_u16'} } */
+ svwrite_lane_zt_s16 (foo, zt_s16, 0); /* { dg-error {incompatible type for argument 1 of 'svwrite_lane_zt_s16'} } */
+ svwrite_lane_zt_u32 (foo, zt_u32, 0); /* { dg-error {incompatible type for argument 1 of 'svwrite_lane_zt_u32'} } */
+ svwrite_lane_zt_s32 (foo, zt_s32, 0); /* { dg-error {incompatible type for argument 1 of 'svwrite_lane_zt_s32'} } */
+ svwrite_lane_zt_u64 (foo, zt_u64, 0); /* { dg-error {incompatible type for argument 1 of 'svwrite_lane_zt_u64'} } */
+ svwrite_lane_zt_s64 (foo, zt_s64, 0); /* { dg-error {incompatible type for argument 1 of 'svwrite_lane_zt_s64'} } */
+ svwrite_lane_zt_bf16 (foo, zt_bf16, 0); /* { dg-error {incompatible type for argument 1 of 'svwrite_lane_zt_bf16'} } */
+ svwrite_lane_zt_f16 (foo, zt_f16, 0); /* { dg-error {incompatible type for argument 1 of 'svwrite_lane_zt_f16'} } */
+ svwrite_lane_zt_f32 (foo, zt_f32, 0); /* { dg-error {incompatible type for argument 1 of 'svwrite_lane_zt_f32'} } */
+ svwrite_lane_zt_f64 (foo, zt_f64, 0); /* { dg-error {incompatible type for argument 1 of 'svwrite_lane_zt_f64'} } */
+
+ svwrite_lane_zt_u8 (0, zt_s8, 0); /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_u8'} } */
+ svwrite_lane_zt_s8 (0, zt_u8, 0); /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_s8'} } */
+ svwrite_lane_zt_u16 (0, zt_s16, 0); /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_u16'} } */
+ svwrite_lane_zt_s16 (0, zt_u16, 0); /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_s16'} } */
+ svwrite_lane_zt_u32 (0, zt_s32, 0); /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_u32'} } */
+ svwrite_lane_zt_s32 (0, zt_u32, 0); /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_s32'} } */
+ svwrite_lane_zt_u64 (0, zt_s64, 0); /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_u64'} } */
+ svwrite_lane_zt_s64 (0, zt_u64, 0); /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_s64'} } */
+ svwrite_lane_zt_bf16 (0, zt_f16, 0); /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_bf16'} } */
+ svwrite_lane_zt_f16 (0, zt_bf16, 0); /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_f16'} } */
+ svwrite_lane_zt_f32 (0, zt_f64, 0); /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_f32'} } */
+ svwrite_lane_zt_f64 (0, zt_f32, 0); /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_f64'} } */
+
+ svwrite_lane_zt_u8 (0, zt_u8x2, 0); /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_u8'} } */
+ svwrite_lane_zt_s8 (0, zt_s8x2, 0); /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_s8'} } */
+ svwrite_lane_zt_u16 (0, zt_u16x2, 0); /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_u16'} } */
+ svwrite_lane_zt_s16 (0, zt_s16x2, 0); /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_s16'} } */
+ svwrite_lane_zt_u32 (0, zt_u32x2, 0); /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_u32'} } */
+ svwrite_lane_zt_s32 (0, zt_s32x2, 0); /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_s32'} } */
+ svwrite_lane_zt_u64 (0, zt_u64x2, 0); /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_u64'} } */
+ svwrite_lane_zt_s64 (0, zt_s64x2, 0); /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_s64'} } */
+ svwrite_lane_zt_bf16 (0, zt_bf16x2, 0); /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_bf16'} } */
+ svwrite_lane_zt_f16 (0, zt_f16x2, 0); /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_f16'} } */
+ svwrite_lane_zt_f32 (0, zt_f32x2, 0); /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_f32'} } */
+ svwrite_lane_zt_f64 (0, zt_f64x2, 0); /* { dg-error {incompatible type for argument 2 of 'svwrite_lane_zt_f64'} } */
+
+ svwrite_lane_zt_u8 (0, zt_u8, foo); /* { dg-error {incompatible type for argument 3 of 'svwrite_lane_zt_u8'} } */
+ svwrite_lane_zt_s8 (0, zt_s8, foo); /* { dg-error {incompatible type for argument 3 of 'svwrite_lane_zt_s8'} } */
+ svwrite_lane_zt_u16 (0, zt_u16, foo); /* { dg-error {incompatible type for argument 3 of 'svwrite_lane_zt_u16'} } */
+ svwrite_lane_zt_s16 (0, zt_s16, foo); /* { dg-error {incompatible type for argument 3 of 'svwrite_lane_zt_s16'} } */
+ svwrite_lane_zt_u32 (0, zt_u32, foo); /* { dg-error {incompatible type for argument 3 of 'svwrite_lane_zt_u32'} } */
+ svwrite_lane_zt_s32 (0, zt_s32, foo); /* { dg-error {incompatible type for argument 3 of 'svwrite_lane_zt_s32'} } */
+ svwrite_lane_zt_u64 (0, zt_u64, foo); /* { dg-error {incompatible type for argument 3 of 'svwrite_lane_zt_u64'} } */
+ svwrite_lane_zt_s64 (0, zt_s64, foo); /* { dg-error {incompatible type for argument 3 of 'svwrite_lane_zt_s64'} } */
+ svwrite_lane_zt_bf16 (0, zt_bf16, foo); /* { dg-error {incompatible type for argument 3 of 'svwrite_lane_zt_bf16'} } */
+ svwrite_lane_zt_f16 (0, zt_f16, foo); /* { dg-error {incompatible type for argument 3 of 'svwrite_lane_zt_f16'} } */
+ svwrite_lane_zt_f32 (0, zt_f32, foo); /* { dg-error {incompatible type for argument 3 of 'svwrite_lane_zt_f32'} } */
+ svwrite_lane_zt_f64 (0, zt_f64, foo); /* { dg-error {incompatible type for argument 3 of 'svwrite_lane_zt_f64'} } */
+}
+
+void
+test_svwrite_zt_inferred_error_arg_type_mismatch (
+ svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16, svint16_t zt_s16,
+ svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64, svint64_t zt_s64,
+ svbfloat16_t zt_bf16, svfloat16_t zt_f16, svfloat32_t zt_f32,
+ svfloat64_t zt_f64, svuint8x2_t zt_u8x2) __arm_streaming __arm_out ("zt0")
+{
+ struct Foo { uint64_t val; } foo = {0};
+ svwrite_lane_zt (foo, zt_u8, 0); /* { dg-error {passing 'struct Foo' to argument 1 of 'svwrite_lane_zt', which expects 'uint64_t'} } */
+ svwrite_lane_zt (0, zt_u8x2, 0); /* { dg-error {passing 'svuint8x2_t' to argument 2 of 'svwrite_lane_zt', which expects a single SVE vector rather than a tuple} } */
+ svwrite_lane_zt (0, zt_u8, foo); /* { dg-error {passing 'struct Foo' to argument 3 of 'svwrite_lane_zt', which expects 'uint64_t'} } */
+}
+
+void
+test_svwrite_lane_zt_explicit_error_zt0_not_immediate (
+ uint64_t zt0, svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16,
+ svint16_t zt_s16, svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64,
+ svint64_t zt_s64, svbfloat16_t zt_bf16, svfloat16_t zt_f16,
+ svfloat32_t zt_f32, svfloat64_t zt_f64) __arm_streaming __arm_out ("zt0")
+{
+ svwrite_lane_zt_u8 (zt0, zt_u8, 0); /* { dg-error {argument 1 of 'svwrite_lane_zt_u8' must be an integer constant expression} } */
+ svwrite_lane_zt_s8 (zt0, zt_s8, 0); /* { dg-error {argument 1 of 'svwrite_lane_zt_s8' must be an integer constant expression} } */
+ svwrite_lane_zt_u16 (zt0, zt_u16, 0); /* { dg-error {argument 1 of 'svwrite_lane_zt_u16' must be an integer constant expression} } */
+ svwrite_lane_zt_s16 (zt0, zt_s16, 0); /* { dg-error {argument 1 of 'svwrite_lane_zt_s16' must be an integer constant expression} } */
+ svwrite_lane_zt_u32 (zt0, zt_u32, 0); /* { dg-error {argument 1 of 'svwrite_lane_zt_u32' must be an integer constant expression} } */
+ svwrite_lane_zt_s32 (zt0, zt_s32, 0); /* { dg-error {argument 1 of 'svwrite_lane_zt_s32' must be an integer constant expression} } */
+ svwrite_lane_zt_u64 (zt0, zt_u64, 0); /* { dg-error {argument 1 of 'svwrite_lane_zt_u64' must be an integer constant expression} } */
+ svwrite_lane_zt_s64 (zt0, zt_s64, 0); /* { dg-error {argument 1 of 'svwrite_lane_zt_s64' must be an integer constant expression} } */
+ svwrite_lane_zt_bf16 (zt0, zt_bf16, 0); /* { dg-error {argument 1 of 'svwrite_lane_zt_bf16' must be an integer constant expression} } */
+ svwrite_lane_zt_f16 (zt0, zt_f16, 0); /* { dg-error {argument 1 of 'svwrite_lane_zt_f16' must be an integer constant expression} } */
+ svwrite_lane_zt_f32 (zt0, zt_f32, 0); /* { dg-error {argument 1 of 'svwrite_lane_zt_f32' must be an integer constant expression} } */
+ svwrite_lane_zt_f64 (zt0, zt_f64, 0); /* { dg-error {argument 1 of 'svwrite_lane_zt_f64' must be an integer constant expression} } */
+}
+
+void
+test_svwrite_lane_zt_inferred_error_zt0_not_immediate (
+ uint64_t zt0, svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16,
+ svint16_t zt_s16, svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64,
+ svint64_t zt_s64, svbfloat16_t zt_bf16, svfloat16_t zt_f16,
+ svfloat32_t zt_f32, svfloat64_t zt_f64) __arm_streaming __arm_out ("zt0")
+{
+ svwrite_lane_zt (zt0, zt_u8, 0); /* { dg-error {argument 1 of 'svwrite_lane_zt' must be an integer constant expression} } */
+ svwrite_lane_zt (zt0, zt_s8, 0); /* { dg-error {argument 1 of 'svwrite_lane_zt' must be an integer constant expression} } */
+ svwrite_lane_zt (zt0, zt_u16, 0); /* { dg-error {argument 1 of 'svwrite_lane_zt' must be an integer constant expression} } */
+ svwrite_lane_zt (zt0, zt_s16, 0); /* { dg-error {argument 1 of 'svwrite_lane_zt' must be an integer constant expression} } */
+ svwrite_lane_zt (zt0, zt_u32, 0); /* { dg-error {argument 1 of 'svwrite_lane_zt' must be an integer constant expression} } */
+ svwrite_lane_zt (zt0, zt_s32, 0); /* { dg-error {argument 1 of 'svwrite_lane_zt' must be an integer constant expression} } */
+ svwrite_lane_zt (zt0, zt_u64, 0); /* { dg-error {argument 1 of 'svwrite_lane_zt' must be an integer constant expression} } */
+ svwrite_lane_zt (zt0, zt_s64, 0); /* { dg-error {argument 1 of 'svwrite_lane_zt' must be an integer constant expression} } */
+ svwrite_lane_zt (zt0, zt_bf16, 0); /* { dg-error {argument 1 of 'svwrite_lane_zt' must be an integer constant expression} } */
+ svwrite_lane_zt (zt0, zt_f16, 0); /* { dg-error {argument 1 of 'svwrite_lane_zt' must be an integer constant expression} } */
+ svwrite_lane_zt (zt0, zt_f32, 0); /* { dg-error {argument 1 of 'svwrite_lane_zt' must be an integer constant expression} } */
+ svwrite_lane_zt (zt0, zt_f64, 0); /* { dg-error {argument 1 of 'svwrite_lane_zt' must be an integer constant expression} } */
+}
+
+void
+test_svwrite_lane_zt_explicit_error_idx_not_immediate (
+ uint64_t idx, svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16,
+ svint16_t zt_s16, svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64,
+ svint64_t zt_s64, svbfloat16_t zt_bf16, svfloat16_t zt_f16,
+ svfloat32_t zt_f32, svfloat64_t zt_f64) __arm_streaming __arm_out ("zt0")
+{
+ svwrite_lane_zt_u8 (0, zt_u8, idx); /* { dg-error {argument 3 of 'svwrite_lane_zt_u8' must be an integer constant expression} } */
+ svwrite_lane_zt_s8 (0, zt_s8, idx); /* { dg-error {argument 3 of 'svwrite_lane_zt_s8' must be an integer constant expression} } */
+ svwrite_lane_zt_u16 (0, zt_u16, idx); /* { dg-error {argument 3 of 'svwrite_lane_zt_u16' must be an integer constant expression} } */
+ svwrite_lane_zt_s16 (0, zt_s16, idx); /* { dg-error {argument 3 of 'svwrite_lane_zt_s16' must be an integer constant expression} } */
+ svwrite_lane_zt_u32 (0, zt_u32, idx); /* { dg-error {argument 3 of 'svwrite_lane_zt_u32' must be an integer constant expression} } */
+ svwrite_lane_zt_s32 (0, zt_s32, idx); /* { dg-error {argument 3 of 'svwrite_lane_zt_s32' must be an integer constant expression} } */
+ svwrite_lane_zt_u64 (0, zt_u64, idx); /* { dg-error {argument 3 of 'svwrite_lane_zt_u64' must be an integer constant expression} } */
+ svwrite_lane_zt_s64 (0, zt_s64, idx); /* { dg-error {argument 3 of 'svwrite_lane_zt_s64' must be an integer constant expression} } */
+ svwrite_lane_zt_bf16 (0, zt_bf16, idx); /* { dg-error {argument 3 of 'svwrite_lane_zt_bf16' must be an integer constant expression} } */
+ svwrite_lane_zt_f16 (0, zt_f16, idx); /* { dg-error {argument 3 of 'svwrite_lane_zt_f16' must be an integer constant expression} } */
+ svwrite_lane_zt_f32 (0, zt_f32, idx); /* { dg-error {argument 3 of 'svwrite_lane_zt_f32' must be an integer constant expression} } */
+ svwrite_lane_zt_f64 (0, zt_f64, idx); /* { dg-error {argument 3 of 'svwrite_lane_zt_f64' must be an integer constant expression} } */
+}
+
+void
+test_svwrite_lane_zt_inferred_error_idx_not_immediate (
+ uint64_t idx, svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16,
+ svint16_t zt_s16, svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64,
+ svint64_t zt_s64, svbfloat16_t zt_bf16, svfloat16_t zt_f16,
+ svfloat32_t zt_f32, svfloat64_t zt_f64) __arm_streaming __arm_out ("zt0")
+{
+ svwrite_lane_zt (0, zt_u8, idx); /* { dg-error {argument 3 of 'svwrite_lane_zt' must be an integer constant expression} } */
+ svwrite_lane_zt (0, zt_s8, idx); /* { dg-error {argument 3 of 'svwrite_lane_zt' must be an integer constant expression} } */
+ svwrite_lane_zt (0, zt_u16, idx); /* { dg-error {argument 3 of 'svwrite_lane_zt' must be an integer constant expression} } */
+ svwrite_lane_zt (0, zt_s16, idx); /* { dg-error {argument 3 of 'svwrite_lane_zt' must be an integer constant expression} } */
+ svwrite_lane_zt (0, zt_u32, idx); /* { dg-error {argument 3 of 'svwrite_lane_zt' must be an integer constant expression} } */
+ svwrite_lane_zt (0, zt_s32, idx); /* { dg-error {argument 3 of 'svwrite_lane_zt' must be an integer constant expression} } */
+ svwrite_lane_zt (0, zt_u64, idx); /* { dg-error {argument 3 of 'svwrite_lane_zt' must be an integer constant expression} } */
+ svwrite_lane_zt (0, zt_s64, idx); /* { dg-error {argument 3 of 'svwrite_lane_zt' must be an integer constant expression} } */
+ svwrite_lane_zt (0, zt_bf16, idx); /* { dg-error {argument 3 of 'svwrite_lane_zt' must be an integer constant expression} } */
+ svwrite_lane_zt (0, zt_f16, idx); /* { dg-error {argument 3 of 'svwrite_lane_zt' must be an integer constant expression} } */
+ svwrite_lane_zt (0, zt_f32, idx); /* { dg-error {argument 3 of 'svwrite_lane_zt' must be an integer constant expression} } */
+ svwrite_lane_zt (0, zt_f64, idx); /* { dg-error {argument 3 of 'svwrite_lane_zt' must be an integer constant expression} } */
+}
+
+void
+test_svwrite_lane_zt_explicit_error_idx_not_in_range (
+ uint64_t idx, svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16,
+ svint16_t zt_s16, svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64,
+ svint64_t zt_s64, svbfloat16_t zt_bf16, svfloat16_t zt_f16,
+ svfloat32_t zt_f32, svfloat64_t zt_f64) __arm_streaming __arm_out ("zt0")
+{
+ svwrite_lane_zt_u8 (0, zt_u8, 4); /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt_u8', which expects a value in the range \[0, 3\]} } */
+ svwrite_lane_zt_s8 (0, zt_s8, 4); /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt_s8', which expects a value in the range \[0, 3\]} } */
+ svwrite_lane_zt_u16 (0, zt_u16, 4); /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt_u16', which expects a value in the range \[0, 3\]} } */
+ svwrite_lane_zt_s16 (0, zt_s16, 4); /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt_s16', which expects a value in the range \[0, 3\]} } */
+ svwrite_lane_zt_u32 (0, zt_u32, 4); /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt_u32', which expects a value in the range \[0, 3\]} } */
+ svwrite_lane_zt_s32 (0, zt_s32, 4); /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt_s32', which expects a value in the range \[0, 3\]} } */
+ svwrite_lane_zt_u64 (0, zt_u64, 4); /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt_u64', which expects a value in the range \[0, 3\]} } */
+ svwrite_lane_zt_s64 (0, zt_s64, 4); /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt_s64', which expects a value in the range \[0, 3\]} } */
+ svwrite_lane_zt_bf16 (0, zt_bf16, 4); /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt_bf16', which expects a value in the range \[0, 3\]} } */
+ svwrite_lane_zt_f16 (0, zt_f16, 4); /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt_f16', which expects a value in the range \[0, 3\]} } */
+ svwrite_lane_zt_f32 (0, zt_f32, 4); /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt_f32', which expects a value in the range \[0, 3\]} } */
+ svwrite_lane_zt_f64 (0, zt_f64, 4); /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt_f64', which expects a value in the range \[0, 3\]} } */
+}
+
+void
+test_svwrite_lane_zt_inferred_error_idx_not_in_range (
+ uint64_t idx, svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16,
+ svint16_t zt_s16, svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64,
+ svint64_t zt_s64, svbfloat16_t zt_bf16, svfloat16_t zt_f16,
+ svfloat32_t zt_f32, svfloat64_t zt_f64) __arm_streaming __arm_out ("zt0")
+{
+ svwrite_lane_zt (0, zt_u8, 4); /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt', which expects a value in the range \[0, 3\]} } */
+ svwrite_lane_zt (0, zt_s8, 4); /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt', which expects a value in the range \[0, 3\]} } */
+ svwrite_lane_zt (0, zt_u16, 4); /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt', which expects a value in the range \[0, 3\]} } */
+ svwrite_lane_zt (0, zt_s16, 4); /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt', which expects a value in the range \[0, 3\]} } */
+ svwrite_lane_zt (0, zt_u32, 4); /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt', which expects a value in the range \[0, 3\]} } */
+ svwrite_lane_zt (0, zt_s32, 4); /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt', which expects a value in the range \[0, 3\]} } */
+ svwrite_lane_zt (0, zt_u64, 4); /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt', which expects a value in the range \[0, 3\]} } */
+ svwrite_lane_zt (0, zt_s64, 4); /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt', which expects a value in the range \[0, 3\]} } */
+ svwrite_lane_zt (0, zt_bf16, 4); /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt', which expects a value in the range \[0, 3\]} } */
+ svwrite_lane_zt (0, zt_f16, 4); /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt', which expects a value in the range \[0, 3\]} } */
+ svwrite_lane_zt (0, zt_f32, 4); /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt', which expects a value in the range \[0, 3\]} } */
+ svwrite_lane_zt (0, zt_f64, 4); /* { dg-error {passing 4 to argument 3 of 'svwrite_lane_zt', which expects a value in the range \[0, 3\]} } */
+}
+
+#pragma GCC reset_options
+#pragma GCC target("+sve2,+sme2")
+void
+test_svwrite_lane_zt_feature_not_enabled (svuint8_t zt_u8) __arm_streaming __arm_out ("zt0")
+{
+ // GCC only complains for the first such instance, so only one test here.
+ svwrite_lane_zt (0, zt_u8, 0); /* { dg-error {ACLE function 'svwrite_lane_zt_u8' requires ISA extension 'sme-lutv2'} } */
+}
--- /dev/null
+/* { dg-options "-std=c23" } */
+/* { dg-do compile } */
+
+/* MOVT (vector to table)
+ Variants are also available for:
+ [_s8], [_u16], [_s16], [_u32], [_s32], [_u64], [_s64]
+ [_bf16], [_f16], [_f32], [_f64]
+ void svwrite_zt[_u8] (uint64_t zt0, svuint8_t zt, uint64_t idx)
+ __arm_streaming __arm_out ("zt0"); */
+
+#pragma GCC target "+sve2,+sme-lutv2"
+static_assert (__ARM_FEATURE_SME_LUTv2 == 1);
+#include <arm_sme.h>
+
+void
+test_svwrite_zt_explicit_ok (
+ svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16, svint16_t zt_s16,
+ svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64, svint64_t zt_s64,
+ svbfloat16_t zt_bf16, svfloat16_t zt_f16, svfloat32_t zt_f32,
+ svfloat64_t zt_f64) __arm_streaming __arm_out ("zt0")
+{
+ svwrite_zt_u8 (0, zt_u8);
+ svwrite_zt_s8 (0, zt_s8);
+ svwrite_zt_u16 (0, zt_u16);
+ svwrite_zt_s16 (0, zt_s16);
+ svwrite_zt_u32 (0, zt_u32);
+ svwrite_zt_s32 (0, zt_s32);
+ svwrite_zt_u64 (0, zt_u64);
+ svwrite_zt_s64 (0, zt_s64);
+ svwrite_zt_bf16 (0, zt_bf16);
+ svwrite_zt_f16 (0, zt_f16);
+ svwrite_zt_f32 (0, zt_f32);
+ svwrite_zt_f64 (0, zt_f64);
+}
+
+void
+test_svwrite_zt_inferred_ok (
+ svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16, svint16_t zt_s16,
+ svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64, svint64_t zt_s64,
+ svbfloat16_t zt_bf16, svfloat16_t zt_f16, svfloat32_t zt_f32,
+ svfloat64_t zt_f64) __arm_streaming __arm_out ("zt0")
+{
+ svwrite_zt (0, zt_u8);
+ svwrite_zt (0, zt_s8);
+ svwrite_zt (0, zt_u16);
+ svwrite_zt (0, zt_s16);
+ svwrite_zt (0, zt_u32);
+ svwrite_zt (0, zt_s32);
+ svwrite_zt (0, zt_u64);
+ svwrite_zt (0, zt_s64);
+ svwrite_zt (0, zt_bf16);
+ svwrite_zt (0, zt_f16);
+ svwrite_zt (0, zt_f32);
+ svwrite_zt (0, zt_f64);
+}
+
+void
+test_svwrite_zt_explicit_error_not_streaming (
+ svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16, svint16_t zt_s16,
+ svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64, svint64_t zt_s64,
+ svbfloat16_t zt_bf16, svfloat16_t zt_f16, svfloat32_t zt_f32,
+ svfloat64_t zt_f64)
+{
+ svwrite_zt_u8 (0, zt_u8); /* { dg-error {ACLE function 'svwrite_zt_u8' can only be called when SME streaming mode is enabled} } */
+ svwrite_zt_s8 (0, zt_s8); /* { dg-error {ACLE function 'svwrite_zt_s8' can only be called when SME streaming mode is enabled} } */
+ svwrite_zt_u16 (0, zt_u16); /* { dg-error {ACLE function 'svwrite_zt_u16' can only be called when SME streaming mode is enabled} } */
+ svwrite_zt_s16 (0, zt_s16); /* { dg-error {ACLE function 'svwrite_zt_s16' can only be called when SME streaming mode is enabled} } */
+ svwrite_zt_u32 (0, zt_u32); /* { dg-error {ACLE function 'svwrite_zt_u32' can only be called when SME streaming mode is enabled} } */
+ svwrite_zt_s32 (0, zt_s32); /* { dg-error {ACLE function 'svwrite_zt_s32' can only be called when SME streaming mode is enabled} } */
+ svwrite_zt_u64 (0, zt_u64); /* { dg-error {ACLE function 'svwrite_zt_u64' can only be called when SME streaming mode is enabled} } */
+ svwrite_zt_s64 (0, zt_s64); /* { dg-error {ACLE function 'svwrite_zt_s64' can only be called when SME streaming mode is enabled} } */
+ svwrite_zt_bf16 (0, zt_bf16); /* { dg-error {ACLE function 'svwrite_zt_bf16' can only be called when SME streaming mode is enabled} } */
+ svwrite_zt_f16 (0, zt_f16); /* { dg-error {ACLE function 'svwrite_zt_f16' can only be called when SME streaming mode is enabled} } */
+ svwrite_zt_f32 (0, zt_f32); /* { dg-error {ACLE function 'svwrite_zt_f32' can only be called when SME streaming mode is enabled} } */
+ svwrite_zt_f64 (0, zt_f64); /* { dg-error {ACLE function 'svwrite_zt_f64' can only be called when SME streaming mode is enabled} } */
+}
+
+void
+test_svwrite_zt_inferred_error_not_streaming (
+ svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16, svint16_t zt_s16,
+ svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64, svint64_t zt_s64,
+ svbfloat16_t zt_bf16, svfloat16_t zt_f16, svfloat32_t zt_f32,
+ svfloat64_t zt_f64)
+{
+ svwrite_zt (0, zt_u8); /* { dg-error {ACLE function 'svwrite_zt_u8' can only be called when SME streaming mode is enabled} } */
+ svwrite_zt (0, zt_s8); /* { dg-error {ACLE function 'svwrite_zt_s8' can only be called when SME streaming mode is enabled} } */
+ svwrite_zt (0, zt_u16); /* { dg-error {ACLE function 'svwrite_zt_u16' can only be called when SME streaming mode is enabled} } */
+ svwrite_zt (0, zt_s16); /* { dg-error {ACLE function 'svwrite_zt_s16' can only be called when SME streaming mode is enabled} } */
+ svwrite_zt (0, zt_u32); /* { dg-error {ACLE function 'svwrite_zt_u32' can only be called when SME streaming mode is enabled} } */
+ svwrite_zt (0, zt_s32); /* { dg-error {ACLE function 'svwrite_zt_s32' can only be called when SME streaming mode is enabled} } */
+ svwrite_zt (0, zt_u64); /* { dg-error {ACLE function 'svwrite_zt_u64' can only be called when SME streaming mode is enabled} } */
+ svwrite_zt (0, zt_s64); /* { dg-error {ACLE function 'svwrite_zt_s64' can only be called when SME streaming mode is enabled} } */
+ svwrite_zt (0, zt_bf16); /* { dg-error {ACLE function 'svwrite_zt_bf16' can only be called when SME streaming mode is enabled} } */
+ svwrite_zt (0, zt_f16); /* { dg-error {ACLE function 'svwrite_zt_f16' can only be called when SME streaming mode is enabled} } */
+ svwrite_zt (0, zt_f32); /* { dg-error {ACLE function 'svwrite_zt_f32' can only be called when SME streaming mode is enabled} } */
+ svwrite_zt (0, zt_f64); /* { dg-error {ACLE function 'svwrite_zt_f64' can only be called when SME streaming mode is enabled} } */
+}
+
+void
+test_svwrite_zt_explicit_error_arg_count_mismatch (
+ svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16, svint16_t zt_s16,
+ svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64, svint64_t zt_s64,
+ svbfloat16_t zt_bf16, svfloat16_t zt_f16, svfloat32_t zt_f32,
+ svfloat64_t zt_f64) __arm_streaming __arm_out ("zt0")
+{
+ svwrite_zt_u8 (); /* { dg-error {too few arguments to function 'svwrite_zt_u8'; expected 2, have 0} } */
+ svwrite_zt_s8 (); /* { dg-error {too few arguments to function 'svwrite_zt_s8'; expected 2, have 0} } */
+ svwrite_zt_u16 (); /* { dg-error {too few arguments to function 'svwrite_zt_u16'; expected 2, have 0} } */
+ svwrite_zt_s16 (); /* { dg-error {too few arguments to function 'svwrite_zt_s16'; expected 2, have 0} } */
+ svwrite_zt_u32 (); /* { dg-error {too few arguments to function 'svwrite_zt_u32'; expected 2, have 0} } */
+ svwrite_zt_s32 (); /* { dg-error {too few arguments to function 'svwrite_zt_s32'; expected 2, have 0} } */
+ svwrite_zt_u64 (); /* { dg-error {too few arguments to function 'svwrite_zt_u64'; expected 2, have 0} } */
+ svwrite_zt_s64 (); /* { dg-error {too few arguments to function 'svwrite_zt_s64'; expected 2, have 0} } */
+ svwrite_zt_bf16 (); /* { dg-error {too few arguments to function 'svwrite_zt_bf16'; expected 2, have 0} } */
+ svwrite_zt_f16 (); /* { dg-error {too few arguments to function 'svwrite_zt_f16'; expected 2, have 0} } */
+ svwrite_zt_f32 (); /* { dg-error {too few arguments to function 'svwrite_zt_f32'; expected 2, have 0} } */
+ svwrite_zt_f64 (); /* { dg-error {too few arguments to function 'svwrite_zt_f64'; expected 2, have 0} } */
+
+ svwrite_zt_u8 (0); /* { dg-error {too few arguments to function 'svwrite_zt_u8'; expected 2, have 1} } */
+ svwrite_zt_s8 (0); /* { dg-error {too few arguments to function 'svwrite_zt_s8'; expected 2, have 1} } */
+ svwrite_zt_u16 (0); /* { dg-error {too few arguments to function 'svwrite_zt_u16'; expected 2, have 1} } */
+ svwrite_zt_s16 (0); /* { dg-error {too few arguments to function 'svwrite_zt_s16'; expected 2, have 1} } */
+ svwrite_zt_u32 (0); /* { dg-error {too few arguments to function 'svwrite_zt_u32'; expected 2, have 1} } */
+ svwrite_zt_s32 (0); /* { dg-error {too few arguments to function 'svwrite_zt_s32'; expected 2, have 1} } */
+ svwrite_zt_u64 (0); /* { dg-error {too few arguments to function 'svwrite_zt_u64'; expected 2, have 1} } */
+ svwrite_zt_s64 (0); /* { dg-error {too few arguments to function 'svwrite_zt_s64'; expected 2, have 1} } */
+ svwrite_zt_bf16 (0); /* { dg-error {too few arguments to function 'svwrite_zt_bf16'; expected 2, have 1} } */
+ svwrite_zt_f16 (0); /* { dg-error {too few arguments to function 'svwrite_zt_f16'; expected 2, have 1} } */
+ svwrite_zt_f32 (0); /* { dg-error {too few arguments to function 'svwrite_zt_f32'; expected 2, have 1} } */
+ svwrite_zt_f64 (0); /* { dg-error {too few arguments to function 'svwrite_zt_f64'; expected 2, have 1} } */
+
+ svwrite_zt_u8 (0, zt_u8, 0); /* { dg-error {too many arguments to function 'svwrite_zt_u8'; expected 2, have 3} } */
+ svwrite_zt_s8 (0, zt_s8, 0); /* { dg-error {too many arguments to function 'svwrite_zt_s8'; expected 2, have 3} } */
+ svwrite_zt_u16 (0, zt_u16, 0); /* { dg-error {too many arguments to function 'svwrite_zt_u16'; expected 2, have 3} } */
+ svwrite_zt_s16 (0, zt_s16, 0); /* { dg-error {too many arguments to function 'svwrite_zt_s16'; expected 2, have 3} } */
+ svwrite_zt_u32 (0, zt_u32, 0); /* { dg-error {too many arguments to function 'svwrite_zt_u32'; expected 2, have 3} } */
+ svwrite_zt_s32 (0, zt_s32, 0); /* { dg-error {too many arguments to function 'svwrite_zt_s32'; expected 2, have 3} } */
+ svwrite_zt_u64 (0, zt_u64, 0); /* { dg-error {too many arguments to function 'svwrite_zt_u64'; expected 2, have 3} } */
+ svwrite_zt_s64 (0, zt_s64, 0); /* { dg-error {too many arguments to function 'svwrite_zt_s64'; expected 2, have 3} } */
+ svwrite_zt_bf16 (0, zt_bf16, 0); /* { dg-error {too many arguments to function 'svwrite_zt_bf16'; expected 2, have 3} } */
+ svwrite_zt_f16 (0, zt_f16, 0); /* { dg-error {too many arguments to function 'svwrite_zt_f16'; expected 2, have 3} } */
+ svwrite_zt_f32 (0, zt_f32, 0); /* { dg-error {too many arguments to function 'svwrite_zt_f32'; expected 2, have 3} } */
+ svwrite_zt_f64 (0, zt_f64, 0); /* { dg-error {too many arguments to function 'svwrite_zt_f64'; expected 2, have 3} } */
+}
+
+void
+test_svwrite_zt_inferred_error_arg_count_mismatch (
+ svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16, svint16_t zt_s16,
+ svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64, svint64_t zt_s64,
+ svbfloat16_t zt_bf16, svfloat16_t zt_f16, svfloat32_t zt_f32,
+ svfloat64_t zt_f64) __arm_streaming __arm_out ("zt0")
+{
+ svwrite_zt (); /* { dg-error {too few arguments to function 'svwrite_zt'} } */
+ svwrite_zt (0); /* { dg-error {too few arguments to function 'svwrite_zt'} } */
+
+ svwrite_zt (0, zt_u8, 0); /* { dg-error {too many arguments to function 'svwrite_zt'} } */
+ svwrite_zt (0, zt_s8, 0); /* { dg-error {too many arguments to function 'svwrite_zt'} } */
+ svwrite_zt (0, zt_u16, 0); /* { dg-error {too many arguments to function 'svwrite_zt'} } */
+ svwrite_zt (0, zt_s16, 0); /* { dg-error {too many arguments to function 'svwrite_zt'} } */
+ svwrite_zt (0, zt_u32, 0); /* { dg-error {too many arguments to function 'svwrite_zt'} } */
+ svwrite_zt (0, zt_s32, 0); /* { dg-error {too many arguments to function 'svwrite_zt'} } */
+ svwrite_zt (0, zt_u64, 0); /* { dg-error {too many arguments to function 'svwrite_zt'} } */
+ svwrite_zt (0, zt_s64, 0); /* { dg-error {too many arguments to function 'svwrite_zt'} } */
+ svwrite_zt (0, zt_bf16, 0); /* { dg-error {too many arguments to function 'svwrite_zt'} } */
+ svwrite_zt (0, zt_f16, 0); /* { dg-error {too many arguments to function 'svwrite_zt'} } */
+ svwrite_zt (0, zt_f32, 0); /* { dg-error {too many arguments to function 'svwrite_zt'} } */
+ svwrite_zt (0, zt_f64, 0); /* { dg-error {too many arguments to function 'svwrite_zt'} } */
+}
+
+void
+test_svwrite_zt_explicit_error_arg_type_mismatch (
+ svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16, svint16_t zt_s16,
+ svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64, svint64_t zt_s64,
+ svbfloat16_t zt_bf16, svfloat16_t zt_f16, svfloat32_t zt_f32,
+ svfloat64_t zt_f64, svuint8x2_t zt_u8x2, svint8x2_t zt_s8x2,
+ svuint16x2_t zt_u16x2, svint16x2_t zt_s16x2, svuint32x2_t zt_u32x2,
+ svint32x2_t zt_s32x2, svuint64x2_t zt_u64x2, svint64x2_t zt_s64x2,
+ svbfloat16x2_t zt_bf16x2, svfloat16x2_t zt_f16x2, svfloat32x2_t zt_f32x2,
+ svfloat64x2_t zt_f64x2) __arm_streaming __arm_out ("zt0")
+{
+ struct Foo { uint64_t val; } foo = {0};
+ svwrite_zt_u8 (foo, zt_u8); /* { dg-error {incompatible type for argument 1 of 'svwrite_zt_u8'} } */
+ svwrite_zt_s8 (foo, zt_s8); /* { dg-error {incompatible type for argument 1 of 'svwrite_zt_s8'} } */
+ svwrite_zt_u16 (foo, zt_u16); /* { dg-error {incompatible type for argument 1 of 'svwrite_zt_u16'} } */
+ svwrite_zt_s16 (foo, zt_s16); /* { dg-error {incompatible type for argument 1 of 'svwrite_zt_s16'} } */
+ svwrite_zt_u32 (foo, zt_u32); /* { dg-error {incompatible type for argument 1 of 'svwrite_zt_u32'} } */
+ svwrite_zt_s32 (foo, zt_s32); /* { dg-error {incompatible type for argument 1 of 'svwrite_zt_s32'} } */
+ svwrite_zt_u64 (foo, zt_u64); /* { dg-error {incompatible type for argument 1 of 'svwrite_zt_u64'} } */
+ svwrite_zt_s64 (foo, zt_s64); /* { dg-error {incompatible type for argument 1 of 'svwrite_zt_s64'} } */
+ svwrite_zt_bf16 (foo, zt_bf16); /* { dg-error {incompatible type for argument 1 of 'svwrite_zt_bf16'} } */
+ svwrite_zt_f16 (foo, zt_f16); /* { dg-error {incompatible type for argument 1 of 'svwrite_zt_f16'} } */
+ svwrite_zt_f32 (foo, zt_f32); /* { dg-error {incompatible type for argument 1 of 'svwrite_zt_f32'} } */
+ svwrite_zt_f64 (foo, zt_f64); /* { dg-error {incompatible type for argument 1 of 'svwrite_zt_f64'} } */
+
+ svwrite_zt_u8 (0, zt_s8); /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_u8'} } */
+ svwrite_zt_s8 (0, zt_u8); /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_s8'} } */
+ svwrite_zt_u16 (0, zt_s16); /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_u16'} } */
+ svwrite_zt_s16 (0, zt_u16); /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_s16'} } */
+ svwrite_zt_u32 (0, zt_s32); /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_u32'} } */
+ svwrite_zt_s32 (0, zt_u32); /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_s32'} } */
+ svwrite_zt_u64 (0, zt_s64); /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_u64'} } */
+ svwrite_zt_s64 (0, zt_u64); /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_s64'} } */
+ svwrite_zt_bf16 (0, zt_f16); /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_bf16'} } */
+ svwrite_zt_f16 (0, zt_bf16); /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_f16'} } */
+ svwrite_zt_f32 (0, zt_f64); /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_f32'} } */
+ svwrite_zt_f64 (0, zt_f32); /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_f64'} } */
+
+ svwrite_zt_u8 (0, zt_u8x2); /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_u8'} } */
+ svwrite_zt_s8 (0, zt_s8x2); /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_s8'} } */
+ svwrite_zt_u16 (0, zt_u16x2); /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_u16'} } */
+ svwrite_zt_s16 (0, zt_s16x2); /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_s16'} } */
+ svwrite_zt_u32 (0, zt_u32x2); /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_u32'} } */
+ svwrite_zt_s32 (0, zt_s32x2); /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_s32'} } */
+ svwrite_zt_u64 (0, zt_u64x2); /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_u64'} } */
+ svwrite_zt_s64 (0, zt_s64x2); /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_s64'} } */
+ svwrite_zt_bf16 (0, zt_bf16x2); /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_bf16'} } */
+ svwrite_zt_f16 (0, zt_f16x2); /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_f16'} } */
+ svwrite_zt_f32 (0, zt_f32x2); /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_f32'} } */
+ svwrite_zt_f64 (0, zt_f64x2); /* { dg-error {incompatible type for argument 2 of 'svwrite_zt_f64'} } */
+}
+
+void
+test_svwrite_zt_inferred_error_arg_type_mismatch (
+ svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16, svint16_t zt_s16,
+ svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64, svint64_t zt_s64,
+ svbfloat16_t zt_bf16, svfloat16_t zt_f16, svfloat32_t zt_f32,
+ svfloat64_t zt_f64, svuint8x2_t zt_u8x2) __arm_streaming __arm_out ("zt0")
+{
+ struct Foo { uint64_t val; } foo = {0};
+ svwrite_zt (foo, zt_u8); /* { dg-error {passing 'struct Foo' to argument 1 of 'svwrite_zt', which expects 'uint64_t'} } */
+ svwrite_zt (0, zt_u8x2); /* { dg-error {passing 'svuint8x2_t' to argument 2 of 'svwrite_zt', which expects a single SVE vector rather than a tuple} } */
+}
+
+void
+test_svwrite_zt_explicit_error_zt0_not_immediate (
+ uint64_t zt0, svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16,
+ svint16_t zt_s16, svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64,
+ svint64_t zt_s64, svbfloat16_t zt_bf16, svfloat16_t zt_f16,
+ svfloat32_t zt_f32, svfloat64_t zt_f64) __arm_streaming __arm_out ("zt0")
+{
+ svwrite_zt_u8 (zt0, zt_u8); /* { dg-error {argument 1 of 'svwrite_zt_u8' must be an integer constant expression} } */
+ svwrite_zt_s8 (zt0, zt_s8); /* { dg-error {argument 1 of 'svwrite_zt_s8' must be an integer constant expression} } */
+ svwrite_zt_u16 (zt0, zt_u16); /* { dg-error {argument 1 of 'svwrite_zt_u16' must be an integer constant expression} } */
+ svwrite_zt_s16 (zt0, zt_s16); /* { dg-error {argument 1 of 'svwrite_zt_s16' must be an integer constant expression} } */
+ svwrite_zt_u32 (zt0, zt_u32); /* { dg-error {argument 1 of 'svwrite_zt_u32' must be an integer constant expression} } */
+ svwrite_zt_s32 (zt0, zt_s32); /* { dg-error {argument 1 of 'svwrite_zt_s32' must be an integer constant expression} } */
+ svwrite_zt_u64 (zt0, zt_u64); /* { dg-error {argument 1 of 'svwrite_zt_u64' must be an integer constant expression} } */
+ svwrite_zt_s64 (zt0, zt_s64); /* { dg-error {argument 1 of 'svwrite_zt_s64' must be an integer constant expression} } */
+ svwrite_zt_bf16 (zt0, zt_bf16); /* { dg-error {argument 1 of 'svwrite_zt_bf16' must be an integer constant expression} } */
+ svwrite_zt_f16 (zt0, zt_f16); /* { dg-error {argument 1 of 'svwrite_zt_f16' must be an integer constant expression} } */
+ svwrite_zt_f32 (zt0, zt_f32); /* { dg-error {argument 1 of 'svwrite_zt_f32' must be an integer constant expression} } */
+ svwrite_zt_f64 (zt0, zt_f64); /* { dg-error {argument 1 of 'svwrite_zt_f64' must be an integer constant expression} } */
+}
+
+void
+test_svwrite_zt_inferred_error_zt0_not_immediate (
+ uint64_t zt0, svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16,
+ svint16_t zt_s16, svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64,
+ svint64_t zt_s64, svbfloat16_t zt_bf16, svfloat16_t zt_f16,
+ svfloat32_t zt_f32, svfloat64_t zt_f64) __arm_streaming __arm_out ("zt0")
+{
+ svwrite_zt (zt0, zt_u8); /* { dg-error {argument 1 of 'svwrite_zt' must be an integer constant expression} } */
+ svwrite_zt (zt0, zt_s8); /* { dg-error {argument 1 of 'svwrite_zt' must be an integer constant expression} } */
+ svwrite_zt (zt0, zt_u16); /* { dg-error {argument 1 of 'svwrite_zt' must be an integer constant expression} } */
+ svwrite_zt (zt0, zt_s16); /* { dg-error {argument 1 of 'svwrite_zt' must be an integer constant expression} } */
+ svwrite_zt (zt0, zt_u32); /* { dg-error {argument 1 of 'svwrite_zt' must be an integer constant expression} } */
+ svwrite_zt (zt0, zt_s32); /* { dg-error {argument 1 of 'svwrite_zt' must be an integer constant expression} } */
+ svwrite_zt (zt0, zt_u64); /* { dg-error {argument 1 of 'svwrite_zt' must be an integer constant expression} } */
+ svwrite_zt (zt0, zt_s64); /* { dg-error {argument 1 of 'svwrite_zt' must be an integer constant expression} } */
+ svwrite_zt (zt0, zt_bf16); /* { dg-error {argument 1 of 'svwrite_zt' must be an integer constant expression} } */
+ svwrite_zt (zt0, zt_f16); /* { dg-error {argument 1 of 'svwrite_zt' must be an integer constant expression} } */
+ svwrite_zt (zt0, zt_f32); /* { dg-error {argument 1 of 'svwrite_zt' must be an integer constant expression} } */
+ svwrite_zt (zt0, zt_f64); /* { dg-error {argument 1 of 'svwrite_zt' must be an integer constant expression} } */
+}
+
+void
+test_svwrite_zt_explicit_error_zt0_not_in_range (
+ uint64_t zt0, svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16,
+ svint16_t zt_s16, svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64,
+ svint64_t zt_s64, svbfloat16_t zt_bf16, svfloat16_t zt_f16,
+ svfloat32_t zt_f32, svfloat64_t zt_f64) __arm_streaming __arm_out ("zt0")
+{
+ svwrite_zt_u8 (1, zt_u8); /* { dg-error {passing 1 to argument 1 of 'svwrite_zt_u8', which expects the value 0} } */
+ svwrite_zt_s8 (1, zt_s8); /* { dg-error {passing 1 to argument 1 of 'svwrite_zt_s8', which expects the value 0} } */
+ svwrite_zt_u16 (1, zt_u16); /* { dg-error {passing 1 to argument 1 of 'svwrite_zt_u16', which expects the value 0} } */
+ svwrite_zt_s16 (1, zt_s16); /* { dg-error {passing 1 to argument 1 of 'svwrite_zt_s16', which expects the value 0} } */
+ svwrite_zt_u32 (1, zt_u32); /* { dg-error {passing 1 to argument 1 of 'svwrite_zt_u32', which expects the value 0} } */
+ svwrite_zt_s32 (1, zt_s32); /* { dg-error {passing 1 to argument 1 of 'svwrite_zt_s32', which expects the value 0} } */
+ svwrite_zt_u64 (1, zt_u64); /* { dg-error {passing 1 to argument 1 of 'svwrite_zt_u64', which expects the value 0} } */
+ svwrite_zt_s64 (1, zt_s64); /* { dg-error {passing 1 to argument 1 of 'svwrite_zt_s64', which expects the value 0} } */
+ svwrite_zt_bf16 (1, zt_bf16); /* { dg-error {passing 1 to argument 1 of 'svwrite_zt_bf16', which expects the value 0} } */
+ svwrite_zt_f16 (1, zt_f16); /* { dg-error {passing 1 to argument 1 of 'svwrite_zt_f16', which expects the value 0} } */
+ svwrite_zt_f32 (1, zt_f32); /* { dg-error {passing 1 to argument 1 of 'svwrite_zt_f32', which expects the value 0} } */
+ svwrite_zt_f64 (1, zt_f64); /* { dg-error {passing 1 to argument 1 of 'svwrite_zt_f64', which expects the value 0} } */
+
+ svwrite_zt_u8 (-1, zt_u8); /* { dg-error {passing -1 to argument 1 of 'svwrite_zt_u8', which expects the value 0} } */
+ svwrite_zt_s8 (-1, zt_s8); /* { dg-error {passing -1 to argument 1 of 'svwrite_zt_s8', which expects the value 0} } */
+ svwrite_zt_u16 (-1, zt_u16); /* { dg-error {passing -1 to argument 1 of 'svwrite_zt_u16', which expects the value 0} } */
+ svwrite_zt_s16 (-1, zt_s16); /* { dg-error {passing -1 to argument 1 of 'svwrite_zt_s16', which expects the value 0} } */
+ svwrite_zt_u32 (-1, zt_u32); /* { dg-error {passing -1 to argument 1 of 'svwrite_zt_u32', which expects the value 0} } */
+ svwrite_zt_s32 (-1, zt_s32); /* { dg-error {passing -1 to argument 1 of 'svwrite_zt_s32', which expects the value 0} } */
+ svwrite_zt_u64 (-1, zt_u64); /* { dg-error {passing -1 to argument 1 of 'svwrite_zt_u64', which expects the value 0} } */
+ svwrite_zt_s64 (-1, zt_s64); /* { dg-error {passing -1 to argument 1 of 'svwrite_zt_s64', which expects the value 0} } */
+ svwrite_zt_bf16 (-1, zt_bf16); /* { dg-error {passing -1 to argument 1 of 'svwrite_zt_bf16', which expects the value 0} } */
+ svwrite_zt_f16 (-1, zt_f16); /* { dg-error {passing -1 to argument 1 of 'svwrite_zt_f16', which expects the value 0} } */
+ svwrite_zt_f32 (-1, zt_f32); /* { dg-error {passing -1 to argument 1 of 'svwrite_zt_f32', which expects the value 0} } */
+ svwrite_zt_f64 (-1, zt_f64); /* { dg-error {passing -1 to argument 1 of 'svwrite_zt_f64', which expects the value 0} } */
+}
+
+void
+test_svwrite_zt_inferred_error_zt0_not_in_range (
+ uint64_t zt0, svuint8_t zt_u8, svint8_t zt_s8, svuint16_t zt_u16,
+ svint16_t zt_s16, svuint32_t zt_u32, svint32_t zt_s32, svuint64_t zt_u64,
+ svint64_t zt_s64, svbfloat16_t zt_bf16, svfloat16_t zt_f16,
+ svfloat32_t zt_f32, svfloat64_t zt_f64) __arm_streaming __arm_out ("zt0")
+{
+ svwrite_zt (1, zt_u8); /* { dg-error {passing 1 to argument 1 of 'svwrite_zt', which expects the value 0} } */
+ svwrite_zt (1, zt_s8); /* { dg-error {passing 1 to argument 1 of 'svwrite_zt', which expects the value 0} } */
+ svwrite_zt (1, zt_u16); /* { dg-error {passing 1 to argument 1 of 'svwrite_zt', which expects the value 0} } */
+ svwrite_zt (1, zt_s16); /* { dg-error {passing 1 to argument 1 of 'svwrite_zt', which expects the value 0} } */
+ svwrite_zt (1, zt_u32); /* { dg-error {passing 1 to argument 1 of 'svwrite_zt', which expects the value 0} } */
+ svwrite_zt (1, zt_s32); /* { dg-error {passing 1 to argument 1 of 'svwrite_zt', which expects the value 0} } */
+ svwrite_zt (1, zt_u64); /* { dg-error {passing 1 to argument 1 of 'svwrite_zt', which expects the value 0} } */
+ svwrite_zt (1, zt_s64); /* { dg-error {passing 1 to argument 1 of 'svwrite_zt', which expects the value 0} } */
+ svwrite_zt (1, zt_bf16); /* { dg-error {passing 1 to argument 1 of 'svwrite_zt', which expects the value 0} } */
+ svwrite_zt (1, zt_f16); /* { dg-error {passing 1 to argument 1 of 'svwrite_zt', which expects the value 0} } */
+ svwrite_zt (1, zt_f32); /* { dg-error {passing 1 to argument 1 of 'svwrite_zt', which expects the value 0} } */
+ svwrite_zt (1, zt_f64); /* { dg-error {passing 1 to argument 1 of 'svwrite_zt', which expects the value 0} } */
+
+ svwrite_zt (-1, zt_u8); /* { dg-error {passing -1 to argument 1 of 'svwrite_zt', which expects the value 0} } */
+ svwrite_zt (-1, zt_s8); /* { dg-error {passing -1 to argument 1 of 'svwrite_zt', which expects the value 0} } */
+ svwrite_zt (-1, zt_u16); /* { dg-error {passing -1 to argument 1 of 'svwrite_zt', which expects the value 0} } */
+ svwrite_zt (-1, zt_s16); /* { dg-error {passing -1 to argument 1 of 'svwrite_zt', which expects the value 0} } */
+ svwrite_zt (-1, zt_u32); /* { dg-error {passing -1 to argument 1 of 'svwrite_zt', which expects the value 0} } */
+ svwrite_zt (-1, zt_s32); /* { dg-error {passing -1 to argument 1 of 'svwrite_zt', which expects the value 0} } */
+ svwrite_zt (-1, zt_u64); /* { dg-error {passing -1 to argument 1 of 'svwrite_zt', which expects the value 0} } */
+ svwrite_zt (-1, zt_s64); /* { dg-error {passing -1 to argument 1 of 'svwrite_zt', which expects the value 0} } */
+ svwrite_zt (-1, zt_bf16); /* { dg-error {passing -1 to argument 1 of 'svwrite_zt', which expects the value 0} } */
+ svwrite_zt (-1, zt_f16); /* { dg-error {passing -1 to argument 1 of 'svwrite_zt', which expects the value 0} } */
+ svwrite_zt (-1, zt_f32); /* { dg-error {passing -1 to argument 1 of 'svwrite_zt', which expects the value 0} } */
+ svwrite_zt (-1, zt_f64); /* { dg-error {passing -1 to argument 1 of 'svwrite_zt', which expects the value 0} } */
+}
+
+#pragma GCC reset_options
+#pragma GCC target("+sve2,+sme2")
+void
+test_svwrite_zt_feature_not_enabled (svuint8_t zt_u8) __arm_streaming __arm_out ("zt0")
+{
+ // GCC only complains for the first such instance, so only one test here.
+ svwrite_zt_u8 (0, zt_u8); /* { dg-error {ACLE function 'svwrite_zt_u8' requires ISA extension 'sme-lutv2'} } */
+}