gcc/ChangeLog:
* config/aarch64/aarch64-sve-builtins-shapes.cc (struct mop4_def): New
function shape.
* config/aarch64/aarch64-sve-builtins-shapes.h: New function shape.
* config/aarch64/aarch64-sve-builtins-sme.def (DEF_SME_FUNCTION):
Unconditionally define in terms of `DEF_SME_FUNCTION_GS`.
(DEF_SME_ZA_FUNCTION_GS): Unconditionally define in terms of
`DEF_SME_ZA_FUNCTION_GS_FPM`.
(DEF_SME_ZA_FUNCTION): Unconditionally define in terms of
`DEF_SME_ZA_FUNCTION_GS`.
(svmop4a): New function groups.
(svmop4s): Likewise.
* config/aarch64/aarch64-sve-builtins.cc (TYPES_za_s_mf8): New type
array.
(TYPES_mop4_f16f16): Likewise.
(TYPES_mop4_b16b16): Likewise.
(TYPES_mop4_base): Likewise.
(TYPES_mop4_f64f64): Likewise.
(TYPES_mop4_i16i64): Likewise.
(TYPES_mop4_f8f16): Likewise.
(TYPES_mop4_f8f32): Likewise.
(mop4_f16f16): Likewise.
(mop4_b16b16): Likewise.
(mop4_base): Likewise.
(mop4_f64f64): Likewise.
(mop4_i16i64): Likewise.
(mop4_f8f16): Likewise.
(mop4_f8f32): Likewise.
(DEF_SME_ZA_FUNCTION_GS): New macro.
(DEF_SME_ZA_FUNCTION_GS_FPM): Likewise.
* config/aarch64/aarch64-sve-builtins.def (1x1): New SVE function mode.
(1x2): Likewise.
(2x1): Likewise.
(2x2): Likewise.
gcc/testsuite/ChangeLog:
* gcc.target/aarch64/sve/acle/general-c/mop4_b16b16.c: New test.
* gcc.target/aarch64/sve/acle/general-c/mop4_base.c: Likewise.
* gcc.target/aarch64/sve/acle/general-c/mop4_f16f16.c: Likewise.
* gcc.target/aarch64/sve/acle/general-c/mop4_f64f64.c: Likewise.
* gcc.target/aarch64/sve/acle/general-c/mop4_f8f16.c: Likewise.
* gcc.target/aarch64/sve/acle/general-c/mop4_f8f32.c: Likewise.
* gcc.target/aarch64/sve/acle/general-c/mop4_i16i64.c: Likewise.
---
.../aarch64/aarch64-sve-builtins-shapes.cc | 41 +++++++
.../aarch64/aarch64-sve-builtins-shapes.h | 1 +
.../aarch64/aarch64-sve-builtins-sme.def | 79 +++++++++++--
gcc/config/aarch64/aarch64-sve-builtins.cc | 65 ++++++++++-
gcc/config/aarch64/aarch64-sve-builtins.def | 4 +
.../aarch64/sve/acle/general-c/mop4_b16b16.c | 79 +++++++++++++
.../aarch64/sve/acle/general-c/mop4_base.c | 106 ++++++++++++++++++
.../aarch64/sve/acle/general-c/mop4_f16f16.c | 79 +++++++++++++
.../aarch64/sve/acle/general-c/mop4_f64f64.c | 79 +++++++++++++
.../aarch64/sve/acle/general-c/mop4_f8f16.c | 84 ++++++++++++++
.../aarch64/sve/acle/general-c/mop4_f8f32.c | 84 ++++++++++++++
.../aarch64/sve/acle/general-c/mop4_i16i64.c | 88 +++++++++++++++
12 files changed, 774 insertions(+), 15 deletions(-)
create mode 100644
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/mop4_b16b16.c
create mode 100644
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/mop4_base.c
create mode 100644
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/mop4_f16f16.c
create mode 100644
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/mop4_f64f64.c
create mode 100644
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/mop4_f8f16.c
create mode 100644
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/mop4_f8f32.c
create mode 100644
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/mop4_i16i64.c
diff --git a/gcc/config/aarch64/aarch64-sve-builtins-shapes.cc
b/gcc/config/aarch64/aarch64-sve-builtins-shapes.cc
index 3663a9d416b..3d2db1e74aa 100644
--- a/gcc/config/aarch64/aarch64-sve-builtins-shapes.cc
+++ b/gcc/config/aarch64/aarch64-sve-builtins-shapes.cc
@@ -5412,4 +5412,45 @@ struct write_lane_zt_def : public overloaded_base<0>
}
};
SHAPE (write_lane_zt);
+
+struct mop4_def : public overloaded_base<1>
+{
+ void build (function_builder &b,
+ const function_group_info &group) const override
+ {
+ b.add_overloaded_functions (group, MODE_none);
+ build_all (b, "_,su64,v1,v2", group, MODE_1x1);
+ build_all (b, "_,su64,v1,u2", group, MODE_1x2);
+ build_all (b, "_,su64,u1,v2", group, MODE_2x1);
+ build_all (b, "_,su64,u1,u2", group, MODE_2x2);
+ }
+
+ tree resolve (function_resolver &r) const override
+ {
+ mode_suffix_index mode = MODE_1x1;
+ sve_type type1;
+ sve_type type2;
+
+ if (!r.check_num_arguments (3 + (r.fpm_mode == FPM_set))
+ || !r.require_scalar_type (0, "uint64_t")
+ || !r.require_integer_immediate (0)
+ || !(type1 = r.infer_sve_type (1))
+ || !(type2 = r.infer_sve_type (2)))
+ return error_mark_node;
+
+ if (type1.num_vectors == 1 && type2.num_vectors == 1) mode = MODE_1x1;
+ else if (type1.num_vectors == 1 && type2.num_vectors == 2) mode = MODE_1x2;
+ else if (type1.num_vectors == 2 && type2.num_vectors == 1) mode = MODE_2x1;
+ else if (type1.num_vectors == 2 && type2.num_vectors == 2) mode = MODE_2x2;
+
+ return r.resolve_to (mode, r.type_suffix_ids[0],
+ type1.type, type2.type, GROUP_none);
+ }
+
+ bool check (function_checker &c) const override
+ {
+ return c.require_immediate_range (0, 0, c.num_za_tiles () - 1);
+ }
+};
+SHAPE (mop4);
}
diff --git a/gcc/config/aarch64/aarch64-sve-builtins-shapes.h
b/gcc/config/aarch64/aarch64-sve-builtins-shapes.h
index 421cb1e8b85..b3d7e046437 100644
--- a/gcc/config/aarch64/aarch64-sve-builtins-shapes.h
+++ b/gcc/config/aarch64/aarch64-sve-builtins-shapes.h
@@ -263,6 +263,7 @@ namespace aarch64_sve
extern const function_shape *const write_za_slice;
extern const function_shape *const write_zt;
extern const function_shape *const write_lane_zt;
+ extern const function_shape *const mop4;
}
}
diff --git a/gcc/config/aarch64/aarch64-sve-builtins-sme.def
b/gcc/config/aarch64/aarch64-sve-builtins-sme.def
index 978a74f438d..08046eb3610 100644
--- a/gcc/config/aarch64/aarch64-sve-builtins-sme.def
+++ b/gcc/config/aarch64/aarch64-sve-builtins-sme.def
@@ -17,20 +17,14 @@
along with GCC; see the file COPYING3. If not see
<http://www.gnu.org/licenses/>. */
-#ifndef DEF_SME_FUNCTION
#define DEF_SME_FUNCTION(NAME, SHAPE, TYPES, PREDS) \
- DEF_SME_FUNCTION_GS (NAME, SHAPE, TYPES, none, PREDS)
-#endif
+ DEF_SME_FUNCTION_GS (NAME, SHAPE, TYPES, none, PREDS)
-#ifndef DEF_SME_ZA_FUNCTION_GS
#define DEF_SME_ZA_FUNCTION_GS(NAME, SHAPE, TYPES, GROUP, PREDS) \
- DEF_SME_FUNCTION_GS (NAME, SHAPE, TYPES, GROUP, PREDS)
-#endif
+ DEF_SME_ZA_FUNCTION_GS_FPM (NAME, SHAPE, TYPES, GROUP, PREDS, unused)
-#ifndef DEF_SME_ZA_FUNCTION
#define DEF_SME_ZA_FUNCTION(NAME, SHAPE, TYPES, PREDS) \
- DEF_SME_ZA_FUNCTION_GS (NAME, SHAPE, TYPES, none, PREDS)
-#endif
+ DEF_SME_ZA_FUNCTION_GS (NAME, SHAPE, TYPES, none, PREDS)
#define REQUIRED_EXTENSIONS streaming_compatible (0)
DEF_SME_FUNCTION (arm_has_sme, bool_inherent, none, none)
@@ -259,6 +253,73 @@ 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
+// All svmop4a functions also have `_1x2`, `2x1` and `2x2` variants, and all
+// functions except `mf8_mf8` have `svmop4s` variants.
+
+// svmop4a[_1x1]_za16[_f16_f16] (only if __ARM_FEATURE_SME_F16F16 != 0)
+#define REQUIRED_EXTENSIONS streaming_only (AARCH64_FL_SME2 \
+ | AARCH64_FL_SME_MOP4 \
+ | AARCH64_FL_SME_F16F16)
+DEF_SME_ZA_FUNCTION_GS (svmop4a, mop4, mop4_f16f16, none, none)
+DEF_SME_ZA_FUNCTION_GS (svmop4s, mop4, mop4_f16f16, none, none)
+#undef REQUIRED_EXTENSIONS
+
+// svmop4a[_1x1]_za16[_bf16_bf16] (only if __ARM_FEATURE_SME_B16B16 != 0)
+#define REQUIRED_EXTENSIONS streaming_only (AARCH64_FL_SME2 \
+ | AARCH64_FL_SME_MOP4 \
+ | AARCH64_FL_SME_B16B16)
+DEF_SME_ZA_FUNCTION_GS (svmop4a, mop4, mop4_b16b16, none, none)
+DEF_SME_ZA_FUNCTION_GS (svmop4s, mop4, mop4_b16b16, none, none)
+#undef REQUIRED_EXTENSIONS
+
+// svmop4a[_1x1]_za32[_f32_f32]
+// svmop4a[_1x1]_za32[_f16_f16]
+// svmop4a[_1x1]_za32[_bf16_bf16]
+// svmop4a[_1x1]_za32[_s16_s16]
+// svmop4a[_1x1]_za32[_u16_u16]
+// svmop4a[_1x1]_za32[_s8_s8]
+// svmop4a[_1x1]_za32[_u8_u8]
+// svmop4a[_1x1]_za32[_s8_u8]
+// svmop4a[_1x1]_za32[_u8_s8]
+#define REQUIRED_EXTENSIONS streaming_only (AARCH64_FL_SME2 \
+ | AARCH64_FL_SME_MOP4)
+DEF_SME_ZA_FUNCTION_GS (svmop4a, mop4, mop4_base, none, none)
+DEF_SME_ZA_FUNCTION_GS (svmop4s, mop4, mop4_base, none, none)
+#undef REQUIRED_EXTENSIONS
+
+// svmop4a[_1x1]_za64[_f64_f64] (only if __ARM_FEATURE_SME_F64F64 != 0)
+#define REQUIRED_EXTENSIONS streaming_only (AARCH64_FL_SME2 \
+ | AARCH64_FL_SME_MOP4 \
+ | AARCH64_FL_SME_F64F64)
+DEF_SME_ZA_FUNCTION_GS (svmop4a, mop4, mop4_f64f64, none, none)
+DEF_SME_ZA_FUNCTION_GS (svmop4s, mop4, mop4_f64f64, none, none)
+#undef REQUIRED_EXTENSIONS
+
+// svmop4a[_1x1]_za64[_s16_s16] (only if __ARM_FEATURE_SME_I16I64 != 0)
+// svmop4a[_1x1]_za64[_u16_u16] (only if __ARM_FEATURE_SME_I16I64 != 0)
+// svmop4a[_1x1]_za64[_s16_u16] (only if __ARM_FEATURE_SME_I16I64 != 0)
+// svmop4a[_1x1]_za64[_u16_s16] (only if __ARM_FEATURE_SME_I16I64 != 0)
+#define REQUIRED_EXTENSIONS streaming_only (AARCH64_FL_SME2 \
+ | AARCH64_FL_SME_MOP4 \
+ | AARCH64_FL_SME_I16I64)
+DEF_SME_ZA_FUNCTION_GS (svmop4a, mop4, mop4_i16i64, none, none)
+DEF_SME_ZA_FUNCTION_GS (svmop4s, mop4, mop4_i16i64, none, none)
+#undef REQUIRED_EXTENSIONS
+
+// svmop4a[_1x1]_za16[_mf8_mf8]_fpm (only if __ARM_FEATURE_SME_F8F16 != 0)
+#define REQUIRED_EXTENSIONS streaming_only (AARCH64_FL_SME2 \
+ | AARCH64_FL_SME_MOP4 \
+ | AARCH64_FL_SME_F8F16)
+DEF_SME_ZA_FUNCTION_GS_FPM (svmop4a, mop4, mop4_f8f16, none, none, set)
+#undef REQUIRED_EXTENSIONS
+
+// svmop4a[_1x1]_za32[_mf8_mf8]_fpm (only if __ARM_FEATURE_SME_F8F32 != 0)
+#define REQUIRED_EXTENSIONS streaming_only (AARCH64_FL_SME2 \
+ | AARCH64_FL_SME_MOP4 \
+ | AARCH64_FL_SME_F8F32)
+DEF_SME_ZA_FUNCTION_GS_FPM (svmop4a, mop4, mop4_f8f32, none, none, set)
+#undef REQUIRED_EXTENSIONS
+
#undef DEF_SME_ZA_FUNCTION
#undef DEF_SME_ZA_FUNCTION_GS
#undef DEF_SME_FUNCTION
diff --git a/gcc/config/aarch64/aarch64-sve-builtins.cc
b/gcc/config/aarch64/aarch64-sve-builtins.cc
index 89452578e25..11dc822ab55 100644
--- a/gcc/config/aarch64/aarch64-sve-builtins.cc
+++ b/gcc/config/aarch64/aarch64-sve-builtins.cc
@@ -708,10 +708,6 @@ CONSTEXPR const group_suffix_info group_suffixes[] = {
#define TYPES_za_s_integer(S, D, T) \
D (za32, s32), D (za32, u32)
-/* _za32_mf8. */
-#define TYPES_za_s_mf8(S, D, T) \
- D (za32, mf8)
-
/* _za32_f32. */
#define TYPES_za_s_float(S, D, T) \
D (za32, f32)
@@ -756,6 +752,56 @@ CONSTEXPR const group_suffix_info group_suffixes[] = {
#define TYPES_mop_i16i64_unsigned(S, D, T) \
D (za64, u16)
+// svmop4a[_1x1]_za16[_f16_f16] (only if __ARM_FEATURE_SME_F16F16 != 0)
+#define TYPES_mop4_f16f16(S, D, T) \
+ T (za16, f16, f16)
+
+// svmop4a[_1x1]_za16[_bf16_bf16] (only if __ARM_FEATURE_SME_B16B16 != 0)
+#define TYPES_mop4_b16b16(S, D, T) \
+ T (za16, bf16, bf16)
+
+// svmop4a[_1x1]_za32[_f32]
+// svmop4a[_1x1]_za32[_f16_f16]
+// svmop4a[_1x1]_za32[_bf16_bf16]
+// svmop4a[_1x1]_za32[_s16_s16]
+// svmop4a[_1x1]_za32[_u16_u16]
+// svmop4a[_1x1]_za32[_s8_s8]
+// svmop4a[_1x1]_za32[_u8_u8]
+// svmop4a[_1x1]_za32[_s8_u8]
+// svmop4a[_1x1]_za32[_u8_s8]
+#define TYPES_mop4_base(S, D, T) \
+ T (za32, f32, f32), \
+ T (za32, f16, f16), \
+ T (za32, bf16, bf16), \
+ T (za32, s16, s16), \
+ T (za32, u16, u16), \
+ T (za32, s8, s8), \
+ T (za32, u8, u8), \
+ T (za32, s8, u8), \
+ T (za32, u8, s8)
+
+// svmop4a[_1x1]_za64[_f64_f64] (only if __ARM_FEATURE_SME_F64F64 != 0)
+#define TYPES_mop4_f64f64(S, D, T) \
+ T (za64, f64, f64)
+
+// svmop4a[_1x1]_za64[_s16_s16] (only if __ARM_FEATURE_SME_I16I64 != 0)
+// svmop4a[_1x1]_za64[_u16_u16] (only if __ARM_FEATURE_SME_I16I64 != 0)
+// svmop4a[_1x1]_za64[_s16_u16] (only if __ARM_FEATURE_SME_I16I64 != 0)
+// svmop4a[_1x1]_za64[_u16_s16] (only if __ARM_FEATURE_SME_I16I64 != 0)
+#define TYPES_mop4_i16i64(S, D, T) \
+ T (za64, s16, s16), \
+ T (za64, u16, u16), \
+ T (za64, s16, u16), \
+ T (za64, u16, s16)
+
+// svmop4a[_1x1]_za16[_mf8_mf8]_fpm (only if __ARM_FEATURE_SME_F8F16 != 0)
+#define TYPES_mop4_f8f16(S, D, T) \
+ T (za16, mf8, mf8)
+
+// svmop4a[_1x1]_za32[_mf8_mf8]_fpm (only if __ARM_FEATURE_SME_F8F32 != 0)
+#define TYPES_mop4_f8f32(S, D, T) \
+ T (za32, mf8, mf8)
+
/* _za. */
#define TYPES_za(S, D, T) \
S (za)
@@ -887,6 +933,13 @@ DEF_SVE_TYPES_ARRAY (mop_base_unsigned);
DEF_SVE_TYPES_ARRAY (mop_i16i64);
DEF_SVE_TYPES_ARRAY (mop_i16i64_signed);
DEF_SVE_TYPES_ARRAY (mop_i16i64_unsigned);
+DEF_SVE_TYPES_ARRAY (mop4_f16f16);
+DEF_SVE_TYPES_ARRAY (mop4_b16b16);
+DEF_SVE_TYPES_ARRAY (mop4_base);
+DEF_SVE_TYPES_ARRAY (mop4_f64f64);
+DEF_SVE_TYPES_ARRAY (mop4_i16i64);
+DEF_SVE_TYPES_ARRAY (mop4_f8f16);
+DEF_SVE_TYPES_ARRAY (mop4_f8f32);
DEF_SVE_TYPES_ARRAY (za);
static const group_suffix_index groups_none[] = {
@@ -1009,11 +1062,11 @@ static CONSTEXPR const function_group_info
sme_function_groups[] = {
{ #NAME, &functions::NAME, &shapes::SHAPE, types_##TYPES, groups_##GROUPS, \
preds_##PREDS, aarch64_required_extensions::REQUIRED_EXTENSIONS, \
FPM_unused },
-#define DEF_SME_ZA_FUNCTION_GS(NAME, SHAPE, TYPES, GROUPS, PREDS) \
+#define DEF_SME_ZA_FUNCTION_GS_FPM(NAME, SHAPE, TYPES, GROUPS, PREDS, FPM) \
{ #NAME, &functions::NAME##_za, &shapes::SHAPE, types_##TYPES, \
groups_##GROUPS, preds_##PREDS, \
aarch64_required_extensions::REQUIRED_EXTENSIONS \
- .and_also (AARCH64_FL_ZA_ON), FPM_unused },
+ .and_also (AARCH64_FL_ZA_ON), FPM_##FPM },
#include "aarch64-sve-builtins-sme.def"
};
diff --git a/gcc/config/aarch64/aarch64-sve-builtins.def
b/gcc/config/aarch64/aarch64-sve-builtins.def
index df77497abae..023e823473f 100644
--- a/gcc/config/aarch64/aarch64-sve-builtins.def
+++ b/gcc/config/aarch64/aarch64-sve-builtins.def
@@ -83,6 +83,10 @@ DEF_SVE_MODE (u64base_u64offset, svuint64_t, svuint64_t,
bytes)
DEF_SVE_MODE (u64index, none, svuint64_t, elements)
DEF_SVE_MODE (u64offset, none, svuint64_t, bytes)
DEF_SVE_MODE (vnum, none, none, vectors)
+DEF_SVE_MODE (1x1, none, none, none)
+DEF_SVE_MODE (1x2, none, none, none)
+DEF_SVE_MODE (2x1, none, none, none)
+DEF_SVE_MODE (2x2, none, none, none)
DEF_SVE_TYPE (svbool_t, 10, __SVBool_t, boolean_type_node)
DEF_SVE_TYPE (svcount_t, 11, __SVCount_t, boolean_type_node)
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/mop4_b16b16.c
b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/mop4_b16b16.c
new file mode 100644
index 00000000000..d9a535ba7a7
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/mop4_b16b16.c
@@ -0,0 +1,79 @@
+// { dg-options "-std=c23 -fsyntax-only" }
+// { dg-do compile }
+
+// svmop4a[_1x1]_za16[_bbf16_bbf16] (only if __ARM_FEATURE_SME_B16B16 != 0)
+
+#pragma GCC target "+sve2,+sme-mop4,+sme-b16b16"
+static_assert (__ARM_FEATURE_SME_MOP4 == 1);
+static_assert (__ARM_FEATURE_SME_B16B16 == 1);
+#include <arm_sme.h>
+
+void
+explicit_ok (svbfloat16_t bf16) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_1x1_za16_bf16_bf16 (0, bf16, bf16);
+}
+
+void
+implicit_ok (svbfloat16_t bf16) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_za16 (0, bf16, bf16);
+}
+
+void
+error_not_streaming (svbfloat16_t bf16)
+{
+ svmop4a_1x1_za16_bf16_bf16 (0, bf16, bf16); // { dg-error {ACLE function
'svmop4a_1x1_za16_bf16_bf16' can only be called when SME streaming mode is
enabled} }
+ svmop4a_za16 (0, bf16, bf16); // { dg-error {ACLE function
'svmop4a_1x1_za16_bf16_bf16' can only be called when SME streaming mode is
enabled} }
+}
+
+void
+error_streaming_compatible (svbfloat16_t bf16) __arm_streaming_compatible
+{
+ svmop4a_1x1_za16_bf16_bf16 (0, bf16, bf16); // { dg-error {ACLE function
'svmop4a_1x1_za16_bf16_bf16' can only be called when SME streaming mode is
enabled} }
+ svmop4a_za16 (0, bf16, bf16); // { dg-error {ACLE function
'svmop4a_1x1_za16_bf16_bf16' can only be called when SME streaming mode is
enabled} }
+}
+
+void
+error_arg_count_mismatch (svbfloat16_t bf16) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_1x1_za16_bf16_bf16 (); // { dg-error {too few arguments to function
'svmop4a_1x1_za16_bf16_bf16'; expected 3, have 0} }
+ svmop4a_za16 (); // { dg-error {too few arguments to function
'svmop4a_za16'} }
+
+ svmop4a_1x1_za16_bf16_bf16 (0, bf16, bf16, 0); // { dg-error {too many
arguments to function 'svmop4a_1x1_za16_bf16_bf16'; expected 3, have 4} }
+ svmop4a_za16 (0, bf16, bf16, 0); // { dg-error {too many arguments to
function 'svmop4a_za16'} }
+}
+
+void
+error_arg_type_mismatch (svbfloat16_t bf16, svbfloat16x2_t bf16x2,
+ svbfloat16x4_t bf16x4) __arm_streaming __arm_inout
("za")
+{
+ svmop4a_1x1_za16_bf16_bf16 (0, bf16x2, bf16); // { dg-error {incompatible
type for argument 2 of 'svmop4a_1x1_za16_bf16_bf16'} }
+ svmop4a_za16 (0, bf16x4, bf16); // { dg-error {incompatible type for
argument 2 of 'svmop4a_1x1_za16_bf16_bf16'} }
+}
+
+void
+error_zt0_not_immediate (uint64_t zt0,
+ svbfloat16_t bf16) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_1x1_za16_bf16_bf16 (zt0, bf16, bf16); // { dg-error {argument 1 of
'svmop4a_1x1_za16_bf16_bf16' must be an integer constant expression} }
+ svmop4a_za16 (zt0, bf16, bf16); // { dg-error {argument 1 of 'svmop4a_za16'
must be an integer constant expression} }
+}
+
+void
+error_zt0_not_in_range (svbfloat16_t bf16) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_1x1_za16_bf16_bf16 (-1, bf16, bf16); // { dg-error {passing -1 to
argument 1 of 'svmop4a_1x1_za16_bf16_bf16', which expects a value in the range
\[0, 1\]} }
+ svmop4a_za16 (-1, bf16, bf16); // { dg-error {passing -1 to argument 1 of
'svmop4a_za16', which expects a value in the range \[0, 1\]} }
+
+ svmop4a_1x1_za16_bf16_bf16 (2, bf16, bf16); // { dg-error {passing 2 to
argument 1 of 'svmop4a_1x1_za16_bf16_bf16', which expects a value in the range
\[0, 1\]} }
+ svmop4a_za16 (2, bf16, bf16); // { dg-error {passing 2 to argument 1 of
'svmop4a_za16', which expects a value in the range \[0, 1\]} }
+}
+
+#pragma GCC target "+nothing,+sve2,+sme2,+sme-mop4"
+
+void
+error_missing_feature (svbfloat16_t bf16) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_1x1_za16_bf16_bf16 (0, bf16, bf16); // { dg-error {ACLE function
'svmop4a_1x1_za16_bf16_bf16' requires ISA extension 'sme-b16b16'} }
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/mop4_base.c
b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/mop4_base.c
new file mode 100644
index 00000000000..5e062914705
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/mop4_base.c
@@ -0,0 +1,106 @@
+// { dg-options "-std=c23 -fsyntax-only" }
+// { dg-do compile }
+
+// svmop4a[_1x1]_za32[_f32_f32]
+// svmop4a[_1x1]_za32[_f16_f16]
+// svmop4a[_1x1]_za32[_bf16_bf16]
+// svmop4a[_1x1]_za32[_s16_s16]
+// svmop4a[_1x1]_za32[_u16_u16]
+// svmop4a[_1x1]_za32[_s8_s8]
+// svmop4a[_1x1]_za32[_u8_u8]
+// svmop4a[_1x1]_za32[_s8_u8]
+// svmop4a[_1x1]_za32[_u8_s8]
+
+#pragma GCC target "+sve2,+sme-mop4"
+static_assert (__ARM_FEATURE_SME_MOP4 == 1);
+#include <arm_sme.h>
+
+void
+explicit_ok (svfloat32_t f32, svfloat16_t f16, svbfloat16_t bf16, svint16_t
s16,
+ svuint16_t u16, svint8_t s8,
+ svuint8_t u8) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_1x1_za32_f32_f32 (0, f32, f32);
+ svmop4a_1x1_za32_f16_f16 (0, f16, f16);
+ svmop4a_1x1_za32_bf16_bf16 (0, bf16, bf16);
+ svmop4a_1x1_za32_s16_s16 (0, s16, s16);
+ svmop4a_1x1_za32_u16_u16 (0, u16, u16);
+ svmop4a_1x1_za32_s8_s8 (0, s8, s8);
+ svmop4a_1x1_za32_u8_u8 (0, u8, u8);
+ svmop4a_1x1_za32_s8_u8 (0, s8, u8);
+ svmop4a_1x1_za32_u8_s8 (0, u8, s8);
+}
+
+void
+implicit_ok (svfloat32_t f32, svfloat16_t f16, svbfloat16_t bf16, svint16_t
s16,
+ svuint16_t u16, svint8_t s8,
+ svuint8_t u8) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_za32 (0, f32, f32);
+ svmop4a_za32 (0, f16, f16);
+ svmop4a_za32 (0, bf16, bf16);
+ svmop4a_za32 (0, s16, s16);
+ svmop4a_za32 (0, u16, u16);
+ svmop4a_za32 (0, s8, s8);
+ svmop4a_za32 (0, u8, u8);
+ svmop4a_za32 (0, s8, u8);
+ svmop4a_za32 (0, u8, s8);
+}
+
+void
+error_not_streaming (svfloat16_t f16)
+{
+ svmop4a_1x1_za32_f16_f16 (0, f16, f16); // { dg-error {ACLE function
'svmop4a_1x1_za32_f16_f16' can only be called when SME streaming mode is
enabled} }
+ svmop4a_za32 (0, f16, f16); // { dg-error {ACLE function
'svmop4a_1x1_za32_f16_f16' can only be called when SME streaming mode is
enabled} }
+}
+
+void
+error_streaming_compatible (svfloat16_t f16) __arm_streaming_compatible
+{
+ svmop4a_1x1_za32_f16_f16 (0, f16, f16); // { dg-error {ACLE function
'svmop4a_1x1_za32_f16_f16' can only be called when SME streaming mode is
enabled} }
+ svmop4a_za32 (0, f16, f16); // { dg-error {ACLE function
'svmop4a_1x1_za32_f16_f16' can only be called when SME streaming mode is
enabled} }
+}
+
+void
+error_arg_count_mismatch (svfloat16_t f16) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_1x1_za32_f16_f16 (); // { dg-error {too few arguments to function
'svmop4a_1x1_za32_f16_f16'; expected 3, have 0} }
+ svmop4a_za32 (); // { dg-error {too few arguments to function
'svmop4a_za32'} }
+
+ svmop4a_1x1_za32_f16_f16 (0, f16, f16, 0); // { dg-error {too many arguments
to function 'svmop4a_1x1_za32_f16_f16'; expected 3, have 4} }
+ svmop4a_za32 (0, f16, f16, 0); // { dg-error {too many arguments to function
'svmop4a_za32'} }
+}
+
+void
+error_arg_type_mismatch (svfloat16_t f16, svfloat16x2_t f16x2,
+ svfloat16x4_t f16x4) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_1x1_za32_f16_f16 (0, f16x2, f16); // { dg-error {incompatible type
for argument 2 of 'svmop4a_1x1_za32_f16_f16'} }
+ svmop4a_za32 (0, f16x4, f16); // { dg-error {incompatible type for argument
2 of 'svmop4a_1x1_za32_f16_f16'} }
+}
+
+void
+error_zt0_not_immediate (uint64_t zt0,
+ svfloat16_t f16) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_1x1_za32_f16_f16 (zt0, f16, f16); // { dg-error {argument 1 of
'svmop4a_1x1_za32_f16_f16' must be an integer constant expression} }
+ svmop4a_za32 (zt0, f16, f16); // { dg-error {argument 1 of 'svmop4a_za32'
must be an integer constant expression} }
+}
+
+void
+error_zt0_not_in_range (svfloat16_t f16) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_1x1_za32_f16_f16 (-1, f16, f16); // { dg-error {passing -1 to
argument 1 of 'svmop4a_1x1_za32_f16_f16', which expects a value in the range
\[0, 3\]} }
+ svmop4a_za32 (-1, f16, f16); // { dg-error {passing -1 to argument 1 of
'svmop4a_za32', which expects a value in the range \[0, 3\]} }
+
+ svmop4a_1x1_za32_f16_f16 (4, f16, f16); // { dg-error {passing 4 to argument
1 of 'svmop4a_1x1_za32_f16_f16', which expects a value in the range \[0, 3\]} }
+ svmop4a_za32 (4, f16, f16); // { dg-error {passing 4 to argument 1 of
'svmop4a_za32', which expects a value in the range \[0, 3\]} }
+}
+
+#pragma GCC target "+nothing,+sve2,+sme2"
+
+void
+error_missing_feature (svfloat16_t f16) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_1x1_za32_f16_f16 (0, f16, f16); // { dg-error {ACLE function
'svmop4a_1x1_za32_f16_f16' requires ISA extension 'sme-mop4'} }
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/mop4_f16f16.c
b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/mop4_f16f16.c
new file mode 100644
index 00000000000..dd5fc855b47
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/mop4_f16f16.c
@@ -0,0 +1,79 @@
+// { dg-options "-std=c23 -fsyntax-only" }
+// { dg-do compile }
+
+// svmop4a[_1x1]_za16[_f16_f16] (only if __ARM_FEATURE_SME_F16F16 != 0)
+
+#pragma GCC target "+sve2,+sme-mop4,+sme-f16f16"
+static_assert (__ARM_FEATURE_SME_MOP4 == 1);
+static_assert (__ARM_FEATURE_SME_F16F16 == 1);
+#include <arm_sme.h>
+
+void
+explicit_ok (svfloat16_t f16) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_1x1_za16_f16_f16 (0, f16, f16);
+}
+
+void
+implicit_ok (svfloat16_t f16) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_za16 (0, f16, f16);
+}
+
+void
+error_not_streaming (svfloat16_t f16)
+{
+ svmop4a_1x1_za16_f16_f16 (0, f16, f16); // { dg-error {ACLE function
'svmop4a_1x1_za16_f16_f16' can only be called when SME streaming mode is
enabled} }
+ svmop4a_za16 (0, f16, f16); // { dg-error {ACLE function
'svmop4a_1x1_za16_f16_f16' can only be called when SME streaming mode is
enabled} }
+}
+
+void
+error_streaming_compatible (svfloat16_t f16) __arm_streaming_compatible
+{
+ svmop4a_1x1_za16_f16_f16 (0, f16, f16); // { dg-error {ACLE function
'svmop4a_1x1_za16_f16_f16' can only be called when SME streaming mode is
enabled} }
+ svmop4a_za16 (0, f16, f16); // { dg-error {ACLE function
'svmop4a_1x1_za16_f16_f16' can only be called when SME streaming mode is
enabled} }
+}
+
+void
+error_arg_count_mismatch (svfloat16_t f16) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_1x1_za16_f16_f16 (); // { dg-error {too few arguments to function
'svmop4a_1x1_za16_f16_f16'; expected 3, have 0} }
+ svmop4a_za16 (); // { dg-error {too few arguments to function
'svmop4a_za16'} }
+
+ svmop4a_1x1_za16_f16_f16 (0, f16, f16, 0); // { dg-error {too many arguments
to function 'svmop4a_1x1_za16_f16_f16'; expected 3, have 4} }
+ svmop4a_za16 (0, f16, f16, 0); // { dg-error {too many arguments to function
'svmop4a_za16'} }
+}
+
+void
+error_arg_type_mismatch (svfloat16_t f16, svfloat16x2_t f16x2,
+ svfloat16x4_t f16x4) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_1x1_za16_f16_f16 (0, f16x2, f16); // { dg-error {incompatible type
for argument 2 of 'svmop4a_1x1_za16_f16_f16'} }
+ svmop4a_za16 (0, f16x4, f16); // { dg-error {incompatible type for argument
2 of 'svmop4a_1x1_za16_f16_f16'} }
+}
+
+void
+error_zt0_not_immediate (uint64_t zt0,
+ svfloat16_t f16) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_1x1_za16_f16_f16 (zt0, f16, f16); // { dg-error {argument 1 of
'svmop4a_1x1_za16_f16_f16' must be an integer constant expression} }
+ svmop4a_za16 (zt0, f16, f16); // { dg-error {argument 1 of 'svmop4a_za16'
must be an integer constant expression} }
+}
+
+void
+error_zt0_not_in_range (svfloat16_t f16) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_1x1_za16_f16_f16 (-1, f16, f16); // { dg-error {passing -1 to
argument 1 of 'svmop4a_1x1_za16_f16_f16', which expects a value in the range
\[0, 1\]} }
+ svmop4a_za16 (-1, f16, f16); // { dg-error {passing -1 to argument 1 of
'svmop4a_za16', which expects a value in the range \[0, 1\]} }
+
+ svmop4a_1x1_za16_f16_f16 (2, f16, f16); // { dg-error {passing 2 to argument
1 of 'svmop4a_1x1_za16_f16_f16', which expects a value in the range \[0, 1\]} }
+ svmop4a_za16 (2, f16, f16); // { dg-error {passing 2 to argument 1 of
'svmop4a_za16', which expects a value in the range \[0, 1\]} }
+}
+
+#pragma GCC target "+nothing,+sve2,+sme2,+sme-mop4"
+
+void
+error_missing_feature (svfloat16_t f16) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_1x1_za16_f16_f16 (0, f16, f16); // { dg-error {ACLE function
'svmop4a_1x1_za16_f16_f16' requires ISA extension 'sme-f16f16'} }
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/mop4_f64f64.c
b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/mop4_f64f64.c
new file mode 100644
index 00000000000..9a899f5eaa7
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/mop4_f64f64.c
@@ -0,0 +1,79 @@
+// { dg-options "-std=c23 -fsyntax-only" }
+// { dg-do compile }
+
+// svmop4a[_1x1]_za64[_f64_f64] (only if __ARM_FEATURE_SME_F64F64 != 0)
+
+#pragma GCC target "+sve2,+sme-mop4,+sme-f64f64"
+static_assert (__ARM_FEATURE_SME_MOP4 == 1);
+static_assert (__ARM_FEATURE_SME_F64F64 == 1);
+#include <arm_sme.h>
+
+void
+explicit_ok (svfloat64_t f64) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_1x1_za64_f64_f64 (0, f64, f64);
+}
+
+void
+implicit_ok (svfloat64_t f64) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_za64 (0, f64, f64);
+}
+
+void
+error_not_streaming (svfloat64_t f64)
+{
+ svmop4a_1x1_za64_f64_f64 (0, f64, f64); // { dg-error {ACLE function
'svmop4a_1x1_za64_f64_f64' can only be called when SME streaming mode is
enabled} }
+ svmop4a_za64 (0, f64, f64); // { dg-error {ACLE function
'svmop4a_1x1_za64_f64_f64' can only be called when SME streaming mode is
enabled} }
+}
+
+void
+error_streaming_compatible (svfloat64_t f64) __arm_streaming_compatible
+{
+ svmop4a_1x1_za64_f64_f64 (0, f64, f64); // { dg-error {ACLE function
'svmop4a_1x1_za64_f64_f64' can only be called when SME streaming mode is
enabled} }
+ svmop4a_za64 (0, f64, f64); // { dg-error {ACLE function
'svmop4a_1x1_za64_f64_f64' can only be called when SME streaming mode is
enabled} }
+}
+
+void
+error_arg_count_mismatch (svfloat64_t f64) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_1x1_za64_f64_f64 (); // { dg-error {too few arguments to function
'svmop4a_1x1_za64_f64_f64'; expected 3, have 0} }
+ svmop4a_za64 (); // { dg-error {too few arguments to function
'svmop4a_za64'} }
+
+ svmop4a_1x1_za64_f64_f64 (0, f64, f64, 0); // { dg-error {too many arguments
to function 'svmop4a_1x1_za64_f64_f64'; expected 3, have 4} }
+ svmop4a_za64 (0, f64, f64, 0); // { dg-error {too many arguments to function
'svmop4a_za64'} }
+}
+
+void
+error_arg_type_mismatch (svfloat64_t f64, svfloat64x2_t f64x2,
+ svfloat64x4_t f64x4) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_1x1_za64_f64_f64 (0, f64x2, f64); // { dg-error {incompatible type
for argument 2 of 'svmop4a_1x1_za64_f64_f64'} }
+ svmop4a_za64 (0, f64x4, f64); // { dg-error {incompatible type for argument
2 of 'svmop4a_1x1_za64_f64_f64'} }
+}
+
+void
+error_zt0_not_immediate (uint64_t zt0,
+ svfloat64_t f64) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_1x1_za64_f64_f64 (zt0, f64, f64); // { dg-error {argument 1 of
'svmop4a_1x1_za64_f64_f64' must be an integer constant expression} }
+ svmop4a_za64 (zt0, f64, f64); // { dg-error {argument 1 of 'svmop4a_za64'
must be an integer constant expression} }
+}
+
+void
+error_zt0_not_in_range (svfloat64_t f64) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_1x1_za64_f64_f64 (-1, f64, f64); // { dg-error {passing -1 to
argument 1 of 'svmop4a_1x1_za64_f64_f64', which expects a value in the range
\[0, 7\]} }
+ svmop4a_za64 (-1, f64, f64); // { dg-error {passing -1 to argument 1 of
'svmop4a_za64', which expects a value in the range \[0, 7\]} }
+
+ svmop4a_1x1_za64_f64_f64 (8, f64, f64); // { dg-error {passing 8 to argument
1 of 'svmop4a_1x1_za64_f64_f64', which expects a value in the range \[0, 7\]} }
+ svmop4a_za64 (8, f64, f64); // { dg-error {passing 8 to argument 1 of
'svmop4a_za64', which expects a value in the range \[0, 7\]} }
+}
+
+#pragma GCC target "+nothing,+sve2,+sme2,+sme-mop4"
+
+void
+error_missing_feature (svfloat64_t f64) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_1x1_za64_f64_f64 (0, f64, f64); // { dg-error {ACLE function
'svmop4a_1x1_za64_f64_f64' requires ISA extension 'sme-f64f64'} }
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/mop4_f8f16.c
b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/mop4_f8f16.c
new file mode 100644
index 00000000000..56021dc8cd9
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/mop4_f8f16.c
@@ -0,0 +1,84 @@
+// { dg-options "-std=c23 -fsyntax-only" }
+// { dg-do compile }
+
+// svmop4a[_1x1]_za16[_mf8_mf8]_fpm (only if __ARM_FEATURE_SME_F8F16 != 0)
+
+#pragma GCC target "+sve2,+sme-mop4,+sme-f8f16"
+static_assert (__ARM_FEATURE_SME_MOP4 == 1);
+static_assert (__ARM_FEATURE_SME_F8F16 == 1);
+#include <arm_sme.h>
+
+void
+explicit_ok (svmfloat8_t mf8, fpm_t fpm) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_1x1_za16_mf8_mf8_fpm (0, mf8, mf8, fpm);
+}
+
+void
+implicit_ok (svmfloat8_t mf8, fpm_t fpm) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_za16_fpm (0, mf8, mf8, fpm);
+}
+
+void
+error_not_streaming (svmfloat8_t mf8, fpm_t fpm)
+{
+ svmop4a_1x1_za16_mf8_mf8_fpm (0, mf8, mf8, fpm); // { dg-error {ACLE
function 'svmop4a_1x1_za16_mf8_mf8_fpm' can only be called when SME streaming
mode is enabled} }
+ svmop4a_za16_fpm (0, mf8, mf8, fpm); // { dg-error {ACLE function
'svmop4a_1x1_za16_mf8_mf8_fpm' can only be called when SME streaming mode is
enabled} }
+}
+
+void
+error_streaming_compatible (svmfloat8_t mf8,
+ fpm_t fpm) __arm_streaming_compatible
+{
+ svmop4a_1x1_za16_mf8_mf8_fpm (0, mf8, mf8, fpm); // { dg-error {ACLE
function 'svmop4a_1x1_za16_mf8_mf8_fpm' can only be called when SME streaming
mode is enabled} }
+ svmop4a_za16_fpm (0, mf8, mf8, fpm); // { dg-error {ACLE function
'svmop4a_1x1_za16_mf8_mf8_fpm' can only be called when SME streaming mode is
enabled} }
+}
+
+void
+error_arg_count_mismatch (svmfloat8_t mf8,
+ fpm_t fpm) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_1x1_za16_mf8_mf8_fpm (); // { dg-error {too few arguments to
function 'svmop4a_1x1_za16_mf8_mf8_fpm'; expected 4, have 0} }
+ svmop4a_za16_fpm (); // { dg-error {too few arguments to function
'svmop4a_za16_fpm'} }
+
+ svmop4a_1x1_za16_mf8_mf8_fpm (0, mf8, mf8, fpm, 0); // { dg-error {too many
arguments to function 'svmop4a_1x1_za16_mf8_mf8_fpm'; expected 4, have 5} }
+ svmop4a_za16_fpm (0, mf8, mf8, fpm, 0); // { dg-error {too many arguments to
function 'svmop4a_za16_fpm'} }
+}
+
+void
+error_arg_type_mismatch (svmfloat8_t mf8, svmfloat8x2_t mf8x2,
+ svmfloat8x4_t mf8x4,
+ fpm_t fpm) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_1x1_za16_mf8_mf8_fpm (0, mf8x2, mf8, fpm); // { dg-error
{incompatible type for argument 2 of 'svmop4a_1x1_za16_mf8_mf8_fpm'} }
+ svmop4a_za16_fpm (0, mf8x4, mf8, fpm); // { dg-error {incompatible type for
argument 2 of 'svmop4a_1x1_za16_mf8_mf8_fpm'} }
+}
+
+void
+error_zt0_not_immediate (uint64_t zt0, svmfloat8_t mf8,
+ fpm_t fpm) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_1x1_za16_mf8_mf8_fpm (zt0, mf8, mf8, fpm); // { dg-error {argument 1
of 'svmop4a_1x1_za16_mf8_mf8_fpm' must be an integer constant expression} }
+ svmop4a_za16_fpm (zt0, mf8, mf8, fpm); // { dg-error {argument 1 of
'svmop4a_za16_fpm' must be an integer constant expression} }
+}
+
+void
+error_zt0_not_in_range (svmfloat8_t mf8,
+ fpm_t fpm) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_1x1_za16_mf8_mf8_fpm (-1, mf8, mf8, fpm); // { dg-error {passing -1
to argument 1 of 'svmop4a_1x1_za16_mf8_mf8_fpm', which expects a value in the
range \[0, 1\]} }
+ svmop4a_za16_fpm (-1, mf8, mf8, fpm); // { dg-error {passing -1 to argument
1 of 'svmop4a_za16_fpm', which expects a value in the range \[0, 1\]} }
+
+ svmop4a_1x1_za16_mf8_mf8_fpm (2, mf8, mf8, fpm); // { dg-error {passing 2 to
argument 1 of 'svmop4a_1x1_za16_mf8_mf8_fpm', which expects a value in the
range \[0, 1\]} }
+ svmop4a_za16_fpm (2, mf8, mf8, fpm); // { dg-error {passing 2 to argument 1
of 'svmop4a_za16_fpm', which expects a value in the range \[0, 1\]} }
+}
+
+#pragma GCC target "+nothing,+sve2,+sme2,+sme-mop4"
+
+void
+error_missing_feature (svmfloat8_t mf8,
+ fpm_t fpm) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_1x1_za16_mf8_mf8_fpm (0, mf8, mf8, fpm); // { dg-error {ACLE
function 'svmop4a_1x1_za16_mf8_mf8_fpm' requires ISA extension 'sme-f8f16'} }
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/mop4_f8f32.c
b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/mop4_f8f32.c
new file mode 100644
index 00000000000..21c159a61e6
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/mop4_f8f32.c
@@ -0,0 +1,84 @@
+// { dg-options "-std=c23 -fsyntax-only" }
+// { dg-do compile }
+
+// svmop4a[_1x1]_za32[_mf8_mf8]_fpm (only if __ARM_FEATURE_SME_F8F32 != 0)
+
+#pragma GCC target "+sve2,+sme-mop4,+sme-f8f32"
+static_assert (__ARM_FEATURE_SME_MOP4 == 1);
+static_assert (__ARM_FEATURE_SME_F8F32 == 1);
+#include <arm_sme.h>
+
+void
+explicit_ok (svmfloat8_t mf8, fpm_t fpm) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_1x1_za32_mf8_mf8_fpm (0, mf8, mf8, fpm);
+}
+
+void
+implicit_ok (svmfloat8_t mf8, fpm_t fpm) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_za32_fpm (0, mf8, mf8, fpm);
+}
+
+void
+error_not_streaming (svmfloat8_t mf8, fpm_t fpm)
+{
+ svmop4a_1x1_za32_mf8_mf8_fpm (0, mf8, mf8, fpm); // { dg-error {ACLE
function 'svmop4a_1x1_za32_mf8_mf8_fpm' can only be called when SME streaming
mode is enabled} }
+ svmop4a_za32_fpm (0, mf8, mf8, fpm); // { dg-error {ACLE function
'svmop4a_1x1_za32_mf8_mf8_fpm' can only be called when SME streaming mode is
enabled} }
+}
+
+void
+error_streaming_compatible (svmfloat8_t mf8,
+ fpm_t fpm) __arm_streaming_compatible
+{
+ svmop4a_1x1_za32_mf8_mf8_fpm (0, mf8, mf8, fpm); // { dg-error {ACLE
function 'svmop4a_1x1_za32_mf8_mf8_fpm' can only be called when SME streaming
mode is enabled} }
+ svmop4a_za32_fpm (0, mf8, mf8, fpm); // { dg-error {ACLE function
'svmop4a_1x1_za32_mf8_mf8_fpm' can only be called when SME streaming mode is
enabled} }
+}
+
+void
+error_arg_count_mismatch (svmfloat8_t mf8,
+ fpm_t fpm) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_1x1_za32_mf8_mf8_fpm (); // { dg-error {too few arguments to
function 'svmop4a_1x1_za32_mf8_mf8_fpm'; expected 4, have 0} }
+ svmop4a_za32_fpm (); // { dg-error {too few arguments to function
'svmop4a_za32_fpm'} }
+
+ svmop4a_1x1_za32_mf8_mf8_fpm (0, mf8, mf8, fpm, 0); // { dg-error {too many
arguments to function 'svmop4a_1x1_za32_mf8_mf8_fpm'; expected 4, have 5} }
+ svmop4a_za32_fpm (0, mf8, mf8, fpm, 0); // { dg-error {too many arguments to
function 'svmop4a_za32_fpm'} }
+}
+
+void
+error_arg_type_mismatch (svmfloat8_t mf8, svmfloat8x2_t mf8x2,
+ svmfloat8x4_t mf8x4,
+ fpm_t fpm) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_1x1_za32_mf8_mf8_fpm (0, mf8x2, mf8, fpm); // { dg-error
{incompatible type for argument 2 of 'svmop4a_1x1_za32_mf8_mf8_fpm'} }
+ svmop4a_za32_fpm (0, mf8x4, mf8, fpm); // { dg-error {incompatible type for
argument 2 of 'svmop4a_1x1_za32_mf8_mf8_fpm'} }
+}
+
+void
+error_zt0_not_immediate (uint64_t zt0, svmfloat8_t mf8,
+ fpm_t fpm) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_1x1_za32_mf8_mf8_fpm (zt0, mf8, mf8, fpm); // { dg-error {argument 1
of 'svmop4a_1x1_za32_mf8_mf8_fpm' must be an integer constant expression} }
+ svmop4a_za32_fpm (zt0, mf8, mf8, fpm); // { dg-error {argument 1 of
'svmop4a_za32_fpm' must be an integer constant expression} }
+}
+
+void
+error_zt0_not_in_range (svmfloat8_t mf8,
+ fpm_t fpm) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_1x1_za32_mf8_mf8_fpm (-1, mf8, mf8, fpm); // { dg-error {passing -1
to argument 1 of 'svmop4a_1x1_za32_mf8_mf8_fpm', which expects a value in the
range \[0, 3\]} }
+ svmop4a_za32_fpm (-1, mf8, mf8, fpm); // { dg-error {passing -1 to argument
1 of 'svmop4a_za32_fpm', which expects a value in the range \[0, 3\]} }
+
+ svmop4a_1x1_za32_mf8_mf8_fpm (4, mf8, mf8, fpm); // { dg-error {passing 4 to
argument 1 of 'svmop4a_1x1_za32_mf8_mf8_fpm', which expects a value in the
range \[0, 3\]} }
+ svmop4a_za32_fpm (4, mf8, mf8, fpm); // { dg-error {passing 4 to argument 1
of 'svmop4a_za32_fpm', which expects a value in the range \[0, 3\]} }
+}
+
+#pragma GCC target "+nothing,+sve2,+sme2,+sme-mop4"
+
+void
+error_missing_feature (svmfloat8_t mf8,
+ fpm_t fpm) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_1x1_za32_mf8_mf8_fpm (0, mf8, mf8, fpm); // { dg-error {ACLE
function 'svmop4a_1x1_za32_mf8_mf8_fpm' requires ISA extension 'sme-f8f32'} }
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/mop4_i16i64.c
b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/mop4_i16i64.c
new file mode 100644
index 00000000000..ace25ff9a7b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/mop4_i16i64.c
@@ -0,0 +1,88 @@
+// { dg-options "-std=c23 -fsyntax-only" }
+// { dg-do compile }
+
+// svmop4a[_1x1]_za64[_s16_s16] (only if __ARM_FEATURE_SME_I16I64 != 0)
+// svmop4a[_1x1]_za64[_u16_u16] (only if __ARM_FEATURE_SME_I16I64 != 0)
+// svmop4a[_1x1]_za64[_s16_u16] (only if __ARM_FEATURE_SME_I16I64 != 0)
+// svmop4a[_1x1]_za64[_u16_s16] (only if __ARM_FEATURE_SME_I16I64 != 0)
+
+#pragma GCC target "+sve2,+sme-mop4,+sme-i16i64"
+static_assert (__ARM_FEATURE_SME_MOP4 == 1);
+static_assert (__ARM_FEATURE_SME_I16I64 == 1);
+#include <arm_sme.h>
+
+void
+explicit_ok (svint16_t s16, svuint16_t u16) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_1x1_za64_s16_s16 (0, s16, s16);
+ svmop4a_1x1_za64_u16_u16 (0, u16, u16);
+ svmop4a_1x1_za64_s16_u16 (0, s16, u16);
+ svmop4a_1x1_za64_u16_s16 (0, u16, s16);
+}
+
+void
+implicit_ok (svint16_t s16, svuint16_t u16) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_za64 (0, s16, s16);
+ svmop4a_za64 (0, u16, u16);
+ svmop4a_za64 (0, s16, u16);
+ svmop4a_za64 (0, u16, s16);
+}
+
+void
+error_not_streaming (svint16_t s16)
+{
+ svmop4a_1x1_za64_s16_s16 (0, s16, s16); // { dg-error {ACLE function
'svmop4a_1x1_za64_s16_s16' can only be called when SME streaming mode is
enabled} }
+ svmop4a_za64 (0, s16, s16); // { dg-error {ACLE function
'svmop4a_1x1_za64_s16_s16' can only be called when SME streaming mode is
enabled} }
+}
+
+void
+error_streaming_compatible (svint16_t s16) __arm_streaming_compatible
+{
+ svmop4a_1x1_za64_s16_s16 (0, s16, s16); // { dg-error {ACLE function
'svmop4a_1x1_za64_s16_s16' can only be called when SME streaming mode is
enabled} }
+ svmop4a_za64 (0, s16, s16); // { dg-error {ACLE function
'svmop4a_1x1_za64_s16_s16' can only be called when SME streaming mode is
enabled} }
+}
+
+void
+error_arg_count_mismatch (svint16_t s16) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_1x1_za64_s16_s16 (); // { dg-error {too few arguments to function
'svmop4a_1x1_za64_s16_s16'; expected 3, have 0} }
+ svmop4a_za64 (); // { dg-error {too few arguments to function
'svmop4a_za64'} }
+
+ svmop4a_1x1_za64_s16_s16 (0, s16, s16, 0); // { dg-error {too many arguments
to function 'svmop4a_1x1_za64_s16_s16'; expected 3, have 4} }
+ svmop4a_za64 (0, s16, s16, 0); // { dg-error {too many arguments to function
'svmop4a_za64'} }
+}
+
+void
+error_arg_type_mismatch (svint16_t s16, svint16x2_t s16x2,
+ svint16x4_t s16x4) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_1x1_za64_s16_s16 (0, s16x2, s16); // { dg-error {incompatible type
for argument 2 of 'svmop4a_1x1_za64_s16_s16'} }
+ svmop4a_za64 (0, s16x4, s16); // { dg-error {incompatible type for argument
2 of 'svmop4a_1x1_za64_s16_s16'} }
+}
+
+void
+error_zt0_not_immediate (uint64_t zt0,
+ svint16_t s16) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_1x1_za64_s16_s16 (zt0, s16, s16); // { dg-error {argument 1 of
'svmop4a_1x1_za64_s16_s16' must be an integer constant expression} }
+ svmop4a_za64 (zt0, s16, s16); // { dg-error {argument 1 of 'svmop4a_za64'
must be an integer constant expression} }
+}
+
+void
+error_zt0_not_in_range (svint16_t s16) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_1x1_za64_s16_s16 (-1, s16, s16); // { dg-error {passing -1 to
argument 1 of 'svmop4a_1x1_za64_s16_s16', which expects a value in the range
\[0, 7\]} }
+ svmop4a_za64 (-1, s16, s16); // { dg-error {passing -1 to argument 1 of
'svmop4a_za64', which expects a value in the range \[0, 7\]} }
+
+ svmop4a_1x1_za64_s16_s16 (8, s16, s16); // { dg-error {passing 8 to argument
1 of 'svmop4a_1x1_za64_s16_s16', which expects a value in the range \[0, 7\]} }
+ svmop4a_za64 (8, s16, s16); // { dg-error {passing 8 to argument 1 of
'svmop4a_za64', which expects a value in the range \[0, 7\]} }
+}
+
+#pragma GCC target "+nothing,+sve2,+sme2,+sme-mop4"
+
+void
+error_missing_feature (svint16_t s16) __arm_streaming __arm_inout ("za")
+{
+ svmop4a_1x1_za64_s16_s16 (0, s16, s16); // { dg-error {ACLE function
'svmop4a_1x1_za64_s16_s16' requires ISA extension 'sme-i16i64'} }
+}
--
2.43.0