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