gcc/ChangeLog:
* config/aarch64/aarch64-sme.md (@aarch64_mop4_): New insns.
* config/aarch64/aarch64-sve-builtins-functions.h (class sme_mop4): New
function base.
* config/aarch64/aarch64-sve-builtins-sme.cc (svmop4a_za): New
functions.
(svmop4s_za): New functions.
* config/aarch64/aarch64-sve-builtins-sme.h (svmop4a_za): New function
base.
(svmop4s_za): New function base.
* config/aarch64/iterators.md (SVE_FULL_BI): New mode iterator.
(SVE_FULL_BIx2): Likewise.
(SVE_FULL_BHIx2): Likewise.
(SVE_FULL_BHSDF): Likewise.
(SVE_FULL_BHSDFx2): Likewise.
(SME_MOP_HSDFx2): Likewise.
(UNSPEC_SME_FMOP4A): New unspec.
(UNSPEC_SME_FMOP4S): Likewise.
(UNSPEC_SME_UMOP4A): Likewise.
(UNSPEC_SME_UMOP4S): Likewise.
(UNSPEC_SME_SMOP4A): Likewise.
(UNSPEC_SME_SMOP4S): Likewise.
(UNSPEC_SME_SUMOP4A): Likewise.
(UNSPEC_SME_SUMOP4S): Likewise.
(UNSPEC_SME_USMOP4A): Likewise.
(UNSPEC_SME_USMOP4S): Likewise.
(SME_FP_MOP4): New int iterator.
(SME_FP8_MOP4): Likewise.
(SME_INT_MOP4): Likewise.
gcc/testsuite/ChangeLog:
* gcc.target/aarch64/sme/acle-asm/test_sme_acle.h
(TEST_UNIFORM_ZA): Add new `fpm_t fpm0` argument.
(TEST_DUAL_ZA): Likewise.
* gcc.target/aarch64/sme2/acle-asm/mop4a_za16_bf16_bf16.c: New test.
* gcc.target/aarch64/sme2/acle-asm/mop4a_za16_f16_f16.c: New test.
* gcc.target/aarch64/sme2/acle-asm/mop4a_za16_mf8_mf8.c: New test.
* gcc.target/aarch64/sme2/acle-asm/mop4a_za32_bf16_bf16.c: New test.
* gcc.target/aarch64/sme2/acle-asm/mop4a_za32_f16_f16.c: New test.
* gcc.target/aarch64/sme2/acle-asm/mop4a_za32_f32_f32.c: New test.
* gcc.target/aarch64/sme2/acle-asm/mop4a_za32_mf8_mf8.c: New test.
* gcc.target/aarch64/sme2/acle-asm/mop4a_za32_s16_s16.c: New test.
* gcc.target/aarch64/sme2/acle-asm/mop4a_za32_s8_s8.c: New test.
* gcc.target/aarch64/sme2/acle-asm/mop4a_za32_s8_u8.c: New test.
* gcc.target/aarch64/sme2/acle-asm/mop4a_za32_u16_u16.c: New test.
* gcc.target/aarch64/sme2/acle-asm/mop4a_za32_u8_s8.c: New test.
* gcc.target/aarch64/sme2/acle-asm/mop4a_za32_u8_u8.c: New test.
* gcc.target/aarch64/sme2/acle-asm/mop4a_za64_f64_f64.c: New test.
* gcc.target/aarch64/sme2/acle-asm/mop4a_za64_s16_s16.c: New test.
* gcc.target/aarch64/sme2/acle-asm/mop4a_za64_s16_u16.c: New test.
* gcc.target/aarch64/sme2/acle-asm/mop4a_za64_u16_s16.c: New test.
* gcc.target/aarch64/sme2/acle-asm/mop4a_za64_u16_u16.c: New test.
* gcc.target/aarch64/sme2/acle-asm/mop4s_za16_bf16_bf16.c: New test.
* gcc.target/aarch64/sme2/acle-asm/mop4s_za16_f16_f16.c: New test.
* gcc.target/aarch64/sme2/acle-asm/mop4s_za32_bf16_bf16.c: New test.
* gcc.target/aarch64/sme2/acle-asm/mop4s_za32_f16_f16.c: New test.
* gcc.target/aarch64/sme2/acle-asm/mop4s_za32_s16_s16.c: New test.
* gcc.target/aarch64/sme2/acle-asm/mop4s_za32_s8_s8.c: New test.
* gcc.target/aarch64/sme2/acle-asm/mop4s_za32_s8_u8.c: New test.
* gcc.target/aarch64/sme2/acle-asm/mop4s_za32_u16_u16.c: New test.
* gcc.target/aarch64/sme2/acle-asm/mop4s_za32_u8_s8.c: New test.
* gcc.target/aarch64/sme2/acle-asm/mop4s_za32_u8_u8.c: New test.
* gcc.target/aarch64/sme2/acle-asm/mop4s_za64_f64_f64.c: New test.
* gcc.target/aarch64/sme2/acle-asm/mop4s_za64_s16_s16.c: New test.
* gcc.target/aarch64/sme2/acle-asm/mop4s_za64_s16_u16.c: New test.
* gcc.target/aarch64/sme2/acle-asm/mop4s_za64_u16_s16.c: New test.
* gcc.target/aarch64/sme2/acle-asm/mop4s_za64_u16_u16.c: New test.
---
gcc/config/aarch64/aarch64-sme.md | 173 ++++++++++++++++++
.../aarch64/aarch64-sve-builtins-functions.h | 46 +++++
.../aarch64/aarch64-sve-builtins-sme.cc | 6 +
gcc/config/aarch64/aarch64-sve-builtins-sme.h | 2 +
gcc/config/aarch64/iterators.md | 50 +++++
.../aarch64/sme/acle-asm/test_sme_acle.h | 4 +-
.../sme2/acle-asm/mop4a_za16_bf16_bf16.c | 85 +++++++++
.../sme2/acle-asm/mop4a_za16_f16_f16.c | 85 +++++++++
.../sme2/acle-asm/mop4a_za16_mf8_mf8.c | 85 +++++++++
.../sme2/acle-asm/mop4a_za32_bf16_bf16.c | 85 +++++++++
.../sme2/acle-asm/mop4a_za32_f16_f16.c | 85 +++++++++
.../sme2/acle-asm/mop4a_za32_f32_f32.c | 85 +++++++++
.../sme2/acle-asm/mop4a_za32_mf8_mf8.c | 86 +++++++++
.../sme2/acle-asm/mop4a_za32_s16_s16.c | 85 +++++++++
.../aarch64/sme2/acle-asm/mop4a_za32_s8_s8.c | 85 +++++++++
.../aarch64/sme2/acle-asm/mop4a_za32_s8_u8.c | 85 +++++++++
.../sme2/acle-asm/mop4a_za32_u16_u16.c | 85 +++++++++
.../aarch64/sme2/acle-asm/mop4a_za32_u8_s8.c | 85 +++++++++
.../aarch64/sme2/acle-asm/mop4a_za32_u8_u8.c | 85 +++++++++
.../sme2/acle-asm/mop4a_za64_f64_f64.c | 85 +++++++++
.../sme2/acle-asm/mop4a_za64_s16_s16.c | 85 +++++++++
.../sme2/acle-asm/mop4a_za64_s16_u16.c | 85 +++++++++
.../sme2/acle-asm/mop4a_za64_u16_s16.c | 85 +++++++++
.../sme2/acle-asm/mop4a_za64_u16_u16.c | 85 +++++++++
.../sme2/acle-asm/mop4s_za16_bf16_bf16.c | 85 +++++++++
.../sme2/acle-asm/mop4s_za16_f16_f16.c | 85 +++++++++
.../sme2/acle-asm/mop4s_za32_bf16_bf16.c | 85 +++++++++
.../sme2/acle-asm/mop4s_za32_f16_f16.c | 85 +++++++++
.../sme2/acle-asm/mop4s_za32_s16_s16.c | 85 +++++++++
.../aarch64/sme2/acle-asm/mop4s_za32_s8_s8.c | 85 +++++++++
.../aarch64/sme2/acle-asm/mop4s_za32_s8_u8.c | 85 +++++++++
.../sme2/acle-asm/mop4s_za32_u16_u16.c | 85 +++++++++
.../aarch64/sme2/acle-asm/mop4s_za32_u8_s8.c | 85 +++++++++
.../aarch64/sme2/acle-asm/mop4s_za32_u8_u8.c | 85 +++++++++
.../sme2/acle-asm/mop4s_za64_f64_f64.c | 85 +++++++++
.../sme2/acle-asm/mop4s_za64_s16_s16.c | 85 +++++++++
.../sme2/acle-asm/mop4s_za64_s16_u16.c | 85 +++++++++
.../sme2/acle-asm/mop4s_za64_u16_s16.c | 85 +++++++++
.../sme2/acle-asm/mop4s_za64_u16_u16.c | 85 +++++++++
39 files changed, 3085 insertions(+), 2 deletions(-)
create mode 100644
gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za16_bf16_bf16.c
create mode 100644
gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za16_f16_f16.c
create mode 100644
gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za16_mf8_mf8.c
create mode 100644
gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za32_bf16_bf16.c
create mode 100644
gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za32_f16_f16.c
create mode 100644
gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za32_f32_f32.c
create mode 100644
gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za32_mf8_mf8.c
create mode 100644
gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za32_s16_s16.c
create mode 100644
gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za32_s8_s8.c
create mode 100644
gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za32_s8_u8.c
create mode 100644
gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za32_u16_u16.c
create mode 100644
gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za32_u8_s8.c
create mode 100644
gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za32_u8_u8.c
create mode 100644
gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za64_f64_f64.c
create mode 100644
gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za64_s16_s16.c
create mode 100644
gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za64_s16_u16.c
create mode 100644
gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za64_u16_s16.c
create mode 100644
gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za64_u16_u16.c
create mode 100644
gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za16_bf16_bf16.c
create mode 100644
gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za16_f16_f16.c
create mode 100644
gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za32_bf16_bf16.c
create mode 100644
gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za32_f16_f16.c
create mode 100644
gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za32_s16_s16.c
create mode 100644
gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za32_s8_s8.c
create mode 100644
gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za32_s8_u8.c
create mode 100644
gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za32_u16_u16.c
create mode 100644
gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za32_u8_s8.c
create mode 100644
gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za32_u8_u8.c
create mode 100644
gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za64_f64_f64.c
create mode 100644
gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za64_s16_s16.c
create mode 100644
gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za64_s16_u16.c
create mode 100644
gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za64_u16_s16.c
create mode 100644
gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za64_u16_u16.c
diff --git a/gcc/config/aarch64/aarch64-sme.md
b/gcc/config/aarch64/aarch64-sme.md
index 632ef1e4774..98a47e8f138 100644
--- a/gcc/config/aarch64/aarch64-sme.md
+++ b/gcc/config/aarch64/aarch64-sme.md
@@ -1795,6 +1795,65 @@ (define_insn
"@aarch64_sme_<optab><VNx4SI_ONLY:mode><VNx4SI_ONLY:mode>"
"<optab>\tza%0.s, %1/m, %2/m, %3.s, %4.s"
)
+;; _za32_s16_s16
+;; _za32_u16_u16
+;; _za32_s8_s8
+;; _za32_u8_u8
+;; _za32_s8_u8
+;; _za32_u8_s8
+;; _za64_s16_s16 (only if __ARM_FEATURE_SME_I16I64 != 0)
+;; _za64_u16_u16 (only if __ARM_FEATURE_SME_I16I64 != 0)
+;; _za64_s16_u16 (only if __ARM_FEATURE_SME_I16I64 != 0)
+;; _za64_u16_s16 (only if __ARM_FEATURE_SME_I16I64 != 0)
+(define_insn
"@aarch64_mop4_<optab><SME_ZA_SDI:mode><SVE_FULL_BHI:mode><SVE_FULL_BHI:mode>"
+ [(set (reg:SME_ZA_SDI ZA_REGNUM)
+ (unspec:SME_ZA_SDI
+ [(reg:SME_ZA_SDI ZA_REGNUM)
+ (reg:DI SME_STATE_REGNUM)
+ (match_operand:DI 0 "const_int_operand")
+ (match_operand:SVE_FULL_BHI 1 "register_operand" "Ux2")
+ (match_operand:SVE_FULL_BHI 2 "register_operand" "Uz2")]
+ SME_INT_MOP4))]
+ "TARGET_SME_MOP4"
+ "<optab>\tza%0.<SME_ZA_SDI:Vetype>, %1.<SVE_FULL_BHI:Vetype>,
%2.<SVE_FULL_BHI:Vetype>"
+)
+(define_insn
"@aarch64_mop4_<optab><SME_ZA_SDI:mode><SVE_FULL_BHI:mode><SVE_FULL_BHIx2:mode>"
+ [(set (reg:SME_ZA_SDI ZA_REGNUM)
+ (unspec:SME_ZA_SDI
+ [(reg:SME_ZA_SDI ZA_REGNUM)
+ (reg:DI SME_STATE_REGNUM)
+ (match_operand:DI 0 "const_int_operand")
+ (match_operand:SVE_FULL_BHI 1 "register_operand" "Ux2")
+ (match_operand:SVE_FULL_BHIx2 2 "register_operand" "Uz2")]
+ SME_INT_MOP4))]
+ "TARGET_SME_MOP4"
+ "<optab>\tza%0.<SME_ZA_SDI:Vetype>, %1.<SVE_FULL_BHI:Vetype>, %2"
+)
+(define_insn
"@aarch64_mop4_<optab><SME_ZA_SDI:mode><SVE_FULL_BHIx2:mode><SVE_FULL_BHI:mode>"
+ [(set (reg:SME_ZA_SDI ZA_REGNUM)
+ (unspec:SME_ZA_SDI
+ [(reg:SME_ZA_SDI ZA_REGNUM)
+ (reg:DI SME_STATE_REGNUM)
+ (match_operand:DI 0 "const_int_operand")
+ (match_operand:SVE_FULL_BHIx2 1 "register_operand" "Ux2")
+ (match_operand:SVE_FULL_BHI 2 "register_operand" "Uz2")]
+ SME_INT_MOP4))]
+ "TARGET_SME_MOP4"
+ "<optab>\tza%0.<SME_ZA_SDI:Vetype>, %1, %2.<SVE_FULL_BHI:Vetype>"
+)
+(define_insn
"@aarch64_mop4_<optab><SME_ZA_SDI:mode><SVE_FULL_BHIx2:mode><SVE_FULL_BHIx2:mode>"
+ [(set (reg:SME_ZA_SDI ZA_REGNUM)
+ (unspec:SME_ZA_SDI
+ [(reg:SME_ZA_SDI ZA_REGNUM)
+ (reg:DI SME_STATE_REGNUM)
+ (match_operand:DI 0 "const_int_operand")
+ (match_operand:SVE_FULL_BHIx2 1 "register_operand" "Ux2")
+ (match_operand:SVE_FULL_BHIx2 2 "register_operand" "Uz2")]
+ SME_INT_MOP4))]
+ "TARGET_SME_MOP4"
+ "<optab>\tza%0.<SME_ZA_SDI:Vetype>, %1, %2"
+)
+
;; -------------------------------------------------------------------------
;; ---- [FP] Dot product
;; -------------------------------------------------------------------------
@@ -2137,6 +2196,10 @@ (define_insn
"*aarch64_sme_lane_<optab><VNx4SI_ONLY:mode><SME_ZA_HFx124:mode>"
;; - BFMOPS (SME_B16B16)
;; - FMOPA
;; - FMOPS
+;; - BFMOP4A (SME_B16B16)
+;; - BFMOP4S (SME_B16B16)
+;; - FMOP4A
+;; - FMOP4S
;; -------------------------------------------------------------------------
(define_insn "@aarch64_sme_<optab><mode><mode>"
@@ -2169,6 +2232,116 @@ (define_insn
"@aarch64_sme_<optab><VNx4SI_ONLY:mode><SVE_FULL_HF:mode>"
"<b><optab>\tza%0.<VNx4SI_ONLY:Vetype>, %1/m, %2/m, %3.<SVE_FULL_HF:Vetype>,
%4.<SVE_FULL_HF:Vetype>"
)
+;; _za16_f16_f16 (only if __ARM_FEATURE_SME_F16F16 != 0)
+;; _za16_bf16_bf16 (only if __ARM_FEATURE_SME_B16B16 != 0)
+;; _za32_f32_f32
+;; _za32_f16_f16
+;; _za32_bf16_bf16
+;; _za64_f64_f64 (only if __ARM_FEATURE_SME_F64F64 != 0)
+(define_insn
"@aarch64_mop4_<optab><SVE_FULL_HSDI:mode><SVE_FULL_BHSDF:mode><SVE_FULL_BHSDF:mode>"
+ [(set (reg:SVE_FULL_HSDI ZA_REGNUM)
+ (unspec:SVE_FULL_HSDI
+ [(reg:SVE_FULL_HSDI ZA_REGNUM)
+ (reg:DI SME_STATE_REGNUM)
+ (match_operand:DI 0 "const_int_operand")
+ (match_operand:SVE_FULL_BHSDF 1 "register_operand" "Ux2")
+ (match_operand:SVE_FULL_BHSDF 2 "register_operand" "Uz2")]
+ SME_FP_MOP4))]
+ "TARGET_SME_MOP4"
+ "<b><optab>\tza%0.<SVE_FULL_HSDI:Vetype>, %1.<SVE_FULL_BHSDF:Vetype>,
%2.<SVE_FULL_BHSDF:Vetype>"
+)
+(define_insn
"@aarch64_mop4_<optab><SVE_FULL_HSDI:mode><SVE_FULL_BHSDFx2:mode><SVE_FULL_BHSDFx2:mode>"
+ [(set (reg:SVE_FULL_HSDI ZA_REGNUM)
+ (unspec:SVE_FULL_HSDI
+ [(reg:SVE_FULL_HSDI ZA_REGNUM)
+ (reg:DI SME_STATE_REGNUM)
+ (match_operand:DI 0 "const_int_operand")
+ (match_operand:SVE_FULL_BHSDFx2 1 "register_operand" "Ux2")
+ (match_operand:SVE_FULL_BHSDFx2 2 "register_operand" "Uz2")]
+ SME_FP_MOP4))]
+ "TARGET_SME_MOP4"
+ "<b><optab>\tza%0.<SVE_FULL_HSDI:Vetype>, %1, %2"
+)
+(define_insn
"@aarch64_mop4_<optab><SVE_FULL_HSDI:mode><SVE_FULL_BHSDFx2:mode><SVE_FULL_BHSDF:mode>"
+ [(set (reg:SVE_FULL_HSDI ZA_REGNUM)
+ (unspec:SVE_FULL_HSDI
+ [(reg:SVE_FULL_HSDI ZA_REGNUM)
+ (reg:DI SME_STATE_REGNUM)
+ (match_operand:DI 0 "const_int_operand")
+ (match_operand:SVE_FULL_BHSDFx2 1 "register_operand" "Ux2")
+ (match_operand:SVE_FULL_BHSDF 2 "register_operand" "Uz2")]
+ SME_FP_MOP4))]
+ "TARGET_SME_MOP4"
+ "<SVE_FULL_BHSDFx2:b><optab>\tza%0.<SVE_FULL_HSDI:Vetype>, %1,
%2.<SVE_FULL_BHSDF:Vetype>"
+)
+(define_insn
"@aarch64_mop4_<optab><SVE_FULL_HSDI:mode><SVE_FULL_BHSDF:mode><SVE_FULL_BHSDFx2:mode>"
+ [(set (reg:SVE_FULL_HSDI ZA_REGNUM)
+ (unspec:SVE_FULL_HSDI
+ [(reg:SVE_FULL_HSDI ZA_REGNUM)
+ (reg:DI SME_STATE_REGNUM)
+ (match_operand:DI 0 "const_int_operand")
+ (match_operand:SVE_FULL_BHSDF 1 "register_operand" "Ux2")
+ (match_operand:SVE_FULL_BHSDFx2 2 "register_operand" "Uz2")]
+ SME_FP_MOP4))]
+ "TARGET_SME_MOP4"
+ "<SVE_FULL_BHSDFx2:b><optab>\tza%0.<SVE_FULL_HSDI:Vetype>,
%1.<SVE_FULL_BHSDF:Vetype>, %2"
+)
+
+;; _za16_mf8_mf8_fpm (only if __ARM_FEATURE_SME_F8F16 != 0)
+;; _za32_mf8_mf8_fpm (only if __ARM_FEATURE_SME_F8F32 != 0)
+(define_insn
"@aarch64_mop4_<optab><SME_ZA_MF8:mode><SVE_FULL_BI:mode><SVE_FULL_BI:mode>"
+ [(set (reg:SME_ZA_MF8 ZA_REGNUM)
+ (unspec:SME_ZA_MF8
+ [(reg:SME_ZA_MF8 ZA_REGNUM)
+ (reg:DI SME_STATE_REGNUM)
+ (match_operand:DI 0 "const_int_operand")
+ (match_operand:SVE_FULL_BI 1 "register_operand" "Ux2")
+ (match_operand:SVE_FULL_BI 2 "register_operand" "Uz2")
+ (reg:DI FPM_REGNUM)]
+ SME_FP8_MOP4))]
+ "TARGET_SME_MOP4"
+ "<optab>\tza%0.<SME_ZA_MF8:Vetype>, %1.b, %2.b"
+)
+(define_insn
"@aarch64_mop4_<optab><SME_ZA_MF8:mode><SVE_FULL_BI:mode><SVE_FULL_BIx2:mode>"
+ [(set (reg:SME_ZA_MF8 ZA_REGNUM)
+ (unspec:SME_ZA_MF8
+ [(reg:SME_ZA_MF8 ZA_REGNUM)
+ (reg:DI SME_STATE_REGNUM)
+ (match_operand:DI 0 "const_int_operand")
+ (match_operand:SVE_FULL_BI 1 "register_operand" "Ux2")
+ (match_operand:SVE_FULL_BIx2 2 "register_operand" "Uz2")
+ (reg:DI FPM_REGNUM)]
+ SME_FP8_MOP4))]
+ "TARGET_SME_MOP4"
+ "<optab>\tza%0.<SME_ZA_MF8:Vetype>, %1.b, %2"
+)
+(define_insn
"@aarch64_mop4_<optab><SME_ZA_MF8:mode><SVE_FULL_BIx2:mode><SVE_FULL_BI:mode>"
+ [(set (reg:SME_ZA_MF8 ZA_REGNUM)
+ (unspec:SME_ZA_MF8
+ [(reg:SME_ZA_MF8 ZA_REGNUM)
+ (reg:DI SME_STATE_REGNUM)
+ (match_operand:DI 0 "const_int_operand")
+ (match_operand:SVE_FULL_BIx2 1 "register_operand" "Ux2")
+ (match_operand:SVE_FULL_BI 2 "register_operand" "Uz2")
+ (reg:DI FPM_REGNUM)]
+ SME_FP8_MOP4))]
+ "TARGET_SME_MOP4"
+ "<optab>\tza%0.<SME_ZA_MF8:Vetype>, %1, %2.b"
+)
+(define_insn
"@aarch64_mop4_<optab><SME_ZA_MF8:mode><SVE_FULL_BIx2:mode><SVE_FULL_BIx2:mode>"
+ [(set (reg:SME_ZA_MF8 ZA_REGNUM)
+ (unspec:SME_ZA_MF8
+ [(reg:SME_ZA_MF8 ZA_REGNUM)
+ (reg:DI SME_STATE_REGNUM)
+ (match_operand:DI 0 "const_int_operand")
+ (match_operand:SVE_FULL_BIx2 1 "register_operand" "Ux2")
+ (match_operand:SVE_FULL_BIx2 2 "register_operand" "Uz2")
+ (reg:DI FPM_REGNUM)]
+ SME_FP8_MOP4))]
+ "TARGET_SME_MOP4"
+ "<optab>\tza%0.<SME_ZA_MF8:Vetype>, %1, %2"
+)
+
;; =========================================================================
;; == Table lookup
;; =========================================================================
diff --git a/gcc/config/aarch64/aarch64-sve-builtins-functions.h
b/gcc/config/aarch64/aarch64-sve-builtins-functions.h
index c05946d4ec7..cee724588e9 100644
--- a/gcc/config/aarch64/aarch64-sve-builtins-functions.h
+++ b/gcc/config/aarch64/aarch64-sve-builtins-functions.h
@@ -482,6 +482,52 @@ public:
}
};
+class sme_mop4 : public read_write_za<unspec_based_function_base>
+{
+private:
+ int m_unspec_for_suint;
+ int m_unspec_for_usint;
+
+public:
+ using parent = read_write_za<unspec_based_function_base>;
+
+ constexpr sme_mop4 (int unspec_for_sint, int unspec_for_uint,
+ int unspec_for_fp, int unspec_for_suint,
+ int unspec_for_usint)
+ : parent (unspec_for_sint, unspec_for_uint,
+ unspec_for_fp, unspec_for_fp, 1),
+ m_unspec_for_suint (unspec_for_suint),
+ m_unspec_for_usint (unspec_for_usint)
+ {}
+
+ rtx expand (function_expander &e) const override
+ {
+ machine_mode za_mode = e.vector_mode (0);
+ machine_mode v1_mode = e.tuple_mode (1);
+ machine_mode v2_mode = e.tuple_mode (1);
+
+ if (e.mode_suffix_id == MODE_2x1)
+ v1_mode = targetm.array_mode (v1_mode, 2).require ();
+
+ if (e.mode_suffix_id == MODE_1x2)
+ v2_mode = targetm.array_mode (v2_mode, 2).require ();
+
+ if (e.mode_suffix_id == MODE_2x2)
+ {
+ v1_mode = targetm.array_mode (v1_mode, 2).require ();
+ v2_mode = targetm.array_mode (v2_mode, 2).require ();
+ }
+
+ int unspec = (e.type_suffix (1).unsigned_p == e.type_suffix (2).unsigned_p)
+ ? unspec_for (e)
+ : (e.type_suffix (1).unsigned_p ? m_unspec_for_usint
+ : m_unspec_for_suint);
+
+ insn_code icode = code_for_aarch64_mop4 (unspec, za_mode, v1_mode,
v2_mode);
+ return e.use_exact_insn (icode);
+ }
+};
+
using sme_2mode_function
= sme_2mode_function_t<code_for_aarch64_sme, code_for_aarch64_sme_single>;
diff --git a/gcc/config/aarch64/aarch64-sve-builtins-sme.cc
b/gcc/config/aarch64/aarch64-sve-builtins-sme.cc
index 4657e29ad64..627bfe80857 100644
--- a/gcc/config/aarch64/aarch64-sve-builtins-sme.cc
+++ b/gcc/config/aarch64/aarch64-sve-builtins-sme.cc
@@ -688,6 +688,12 @@ 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 (svmop4a_za, sme_mop4,
+ (UNSPEC_SME_SMOP4A, UNSPEC_SME_UMOP4A, UNSPEC_SME_FMOP4A,
+ UNSPEC_SME_SUMOP4A, UNSPEC_SME_USMOP4A))
+FUNCTION (svmop4s_za, sme_mop4,
+ (UNSPEC_SME_SMOP4S, UNSPEC_SME_UMOP4S, UNSPEC_SME_FMOP4S,
+ UNSPEC_SME_SUMOP4S, UNSPEC_SME_USMOP4S))
FUNCTION (svzero_mask_za, svzero_mask_za_impl, )
FUNCTION (svzero_za, svzero_za_impl, )
FUNCTION (svzero_zt, svzero_zt_impl, )
diff --git a/gcc/config/aarch64/aarch64-sve-builtins-sme.h
b/gcc/config/aarch64/aarch64-sve-builtins-sme.h
index 4968f65442b..fd935086204 100644
--- a/gcc/config/aarch64/aarch64-sve-builtins-sme.h
+++ b/gcc/config/aarch64/aarch64-sve-builtins-sme.h
@@ -77,6 +77,8 @@ namespace aarch64_sve
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 svmop4a_za;
+ extern const function_base *const svmop4s_za;
extern const function_base *const svwrite_lane_zt;
extern const function_base *const svundef_za;
extern const function_base *const svvdot_lane_za;
diff --git a/gcc/config/aarch64/iterators.md b/gcc/config/aarch64/iterators.md
index ff5688529d3..8f1ef74e91a 100644
--- a/gcc/config/aarch64/iterators.md
+++ b/gcc/config/aarch64/iterators.md
@@ -514,9 +514,18 @@ (define_mode_iterator SVE_CLAMP_F [(VNx8BF
"TARGET_SSVE_B16B16")
(VNx4SF "TARGET_SVE2p1_OR_SME2")
(VNx2DF "TARGET_SVE2p1_OR_SME2")])
+;; Fully-packed SVE integer vector modes that have 8-bit elements.
+(define_mode_iterator SVE_FULL_BI [VNx16QI])
+
+;; Pairs of the above.
+(define_mode_iterator SVE_FULL_BIx2 [VNx32QI])
+
;; Fully-packed SVE integer vector modes that have 8-bit or 16-bit elements.
(define_mode_iterator SVE_FULL_BHI [VNx16QI VNx8HI])
+;; Fully-packed SVE integer vector modes that have 8-bit or 16-bit elements.
+(define_mode_iterator SVE_FULL_BHIx2 [VNx32QI VNx16HI])
+
;; Fully-packed SVE integer vector modes that have 8-bit, 16-bit or 32-bit
;; elements.
(define_mode_iterator SVE_FULL_BHSI [VNx16QI VNx8HI VNx4SI])
@@ -590,6 +599,12 @@ (define_mode_iterator SVE_MATMULF [(VNx4SF
"TARGET_SVE_F32MM")
;; SVE floating-point vector modes that have 32-bit or 64-bit elements.
(define_mode_iterator SVE_SDF [VNx2SF SVE_FULL_SDF])
+;; f16, bf16, f32, f64
+(define_mode_iterator SVE_FULL_BHSDF [VNx8BF VNx8HF VNx4SF VNx2DF])
+
+;; f16x2, bf16x2, f32x2, f64x2
+(define_mode_iterator SVE_FULL_BHSDFx2 [VNx16BF VNx16HF VNx8SF VNx4DF])
+
;; Fully-packed SVE vector modes that have 32-bit or smaller elements.
(define_mode_iterator SVE_FULL_BHS [VNx16QI VNx8HI VNx4SI
VNx8BF VNx8HF VNx4SF])
@@ -743,6 +758,9 @@ (define_mode_iterator SVE_SFx24 [VNx8SF VNx16SF])
(define_mode_iterator SME_ZA_I [VNx16QI VNx8HI VNx4SI VNx2DI VNx1TI])
(define_mode_iterator SME_ZA_SDI [VNx4SI (VNx2DI "TARGET_SME_I16I64")])
+(define_mode_iterator SME_ZA_MF8 [(VNx8HI "TARGET_SME_F8F16")
+ (VNx4SI "TARGET_SME_F8F32")])
+
(define_mode_iterator SME_ZA_BIx24 [VNx32QI VNx64QI])
(define_mode_iterator SME_ZA_BHIx124 [VNx16QI VNx32QI VNx64QI
@@ -777,6 +795,11 @@ (define_mode_iterator SME_MOP_HSDF [VNx4SF
(VNx8HF "TARGET_STREAMING_SME_F16F16")
(VNx8BF "TARGET_STREAMING_SME_B16B16")])
+(define_mode_iterator SME_MOP_HSDFx2 [VNx8SF
+ (VNx4DF "TARGET_SME_F64F64")
+ (VNx16HF "TARGET_STREAMING_SME_F16F16")
+ (VNx16BF "TARGET_STREAMING_SME_B16B16")])
+
;; ------------------------------------------------------------------
;; Unspec enumerations for Advance SIMD. These could well go into
;; aarch64.md but for their use in int_iterators here.
@@ -1260,6 +1283,16 @@ (define_c_enum "unspec"
UNSPEC_SME_FMLS
UNSPEC_SME_FMOPA
UNSPEC_SME_FMOPS
+ UNSPEC_SME_FMOP4A
+ UNSPEC_SME_FMOP4S
+ UNSPEC_SME_UMOP4A
+ UNSPEC_SME_UMOP4S
+ UNSPEC_SME_SMOP4A
+ UNSPEC_SME_SMOP4S
+ UNSPEC_SME_SUMOP4A
+ UNSPEC_SME_SUMOP4S
+ UNSPEC_SME_USMOP4A
+ UNSPEC_SME_USMOP4S
UNSPEC_SME_FSUB
UNSPEC_SME_LD1_HOR
UNSPEC_SME_LD1_VER
@@ -3977,6 +4010,13 @@ (define_int_iterator SME2_INT_MOP [UNSPEC_SME_SMOPA
UNSPEC_SME_SMOPS
(define_int_iterator SME_FP_MOP [UNSPEC_SME_FMOPA UNSPEC_SME_FMOPS])
+(define_int_iterator SME_FP_MOP4 [UNSPEC_SME_FMOP4A UNSPEC_SME_FMOP4S])
+(define_int_iterator SME_FP8_MOP4 [UNSPEC_SME_FMOP4A])
+(define_int_iterator SME_INT_MOP4 [UNSPEC_SME_UMOP4A UNSPEC_SME_UMOP4S
+ UNSPEC_SME_SMOP4A UNSPEC_SME_SMOP4S
+ UNSPEC_SME_SUMOP4A UNSPEC_SME_SUMOP4S
+ UNSPEC_SME_USMOP4A UNSPEC_SME_USMOP4S])
+
(define_int_iterator SME2_BMOP [UNSPEC_SME_BMOPA UNSPEC_SME_BMOPS])
(define_int_iterator SME_BINARY_SLICE_SDI [UNSPEC_SME_ADD UNSPEC_SME_SUB])
@@ -4153,6 +4193,16 @@ (define_int_attr optab [(UNSPEC_ANDF "and")
(UNSPEC_SME_FMLS "fmls")
(UNSPEC_SME_FMOPA "fmopa")
(UNSPEC_SME_FMOPS "fmops")
+ (UNSPEC_SME_FMOP4A "fmop4a")
+ (UNSPEC_SME_FMOP4S "fmop4s")
+ (UNSPEC_SME_UMOP4A "umop4a")
+ (UNSPEC_SME_UMOP4S "umop4s")
+ (UNSPEC_SME_SMOP4A "smop4a")
+ (UNSPEC_SME_SMOP4S "smop4s")
+ (UNSPEC_SME_SUMOP4A "sumop4a")
+ (UNSPEC_SME_SUMOP4S "sumop4s")
+ (UNSPEC_SME_USMOP4A "usmop4a")
+ (UNSPEC_SME_USMOP4S "usmop4s")
(UNSPEC_SME_FSUB "fsub")
(UNSPEC_SME_LD1_HOR "ld1_hor")
(UNSPEC_SME_LD1_VER "ld1_ver")
diff --git a/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/test_sme_acle.h
b/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/test_sme_acle.h
index aaadab2f773..df7c3a5d6fa 100644
--- a/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/test_sme_acle.h
+++ b/gcc/testsuite/gcc.target/aarch64/sme/acle-asm/test_sme_acle.h
@@ -46,7 +46,7 @@
#define TEST_UNIFORM_ZA(NAME, TYPE, CODE1, CODE2) \
PROTO (NAME, void, (TYPE z0, TYPE z1, svbool_t p0, \
- svbool_t p1)) \
+ svbool_t p1, fpm_t fpm0)) \
{ \
INVOKE (CODE1, CODE2); \
}
@@ -54,7 +54,7 @@
#define TEST_DUAL_ZA(NAME, TYPE1, TYPE2, CODE1, CODE2) \
PROTO (NAME, void, (TYPE1 z0, TYPE1 z1, TYPE1 z2, TYPE1 z3, \
TYPE2 z4, TYPE2 z5, TYPE2 z6, TYPE2 z7, \
- svbool_t p0, svbool_t p1)) \
+ svbool_t p0, svbool_t p1, fpm_t fpm0)) \
{ \
INVOKE (CODE1, CODE2); \
}
diff --git
a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za16_bf16_bf16.c
b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za16_bf16_bf16.c
new file mode 100644
index 00000000000..92f66b3c5ae
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za16_bf16_bf16.c
@@ -0,0 +1,85 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#pragma GCC target "+sve2,+sme-mop4,+sme-b16b16"
+#include <arm_sme.h>
+#include "test_sme2_acle.h"
+
+/*
+** mop4a_1x1_za16_bf16_bf16_0:
+** ...
+** bfmop4a za0\.h, z0\.h, z30\.h
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_1x1_za16_bf16_bf16_0, svbfloat16_t,
+ svmop4a_1x1_za16_bf16_bf16 (0, z0, z1),
+ svmop4a_za16 (0, z0, z1));
+
+/*
+** mop4a_1x1_za16_bf16_bf16_1:
+** ...
+** bfmop4a za1\.h, z0\.h, z30\.h
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_1x1_za16_bf16_bf16_1, svbfloat16_t,
+ svmop4a_1x1_za16_bf16_bf16 (1, z0, z1),
+ svmop4a_za16 (1, z0, z1));
+
+/*
+** mop4a_1x2_za16_bf16_bf16_0:
+** ...
+** bfmop4a za0\.h, z0\.h, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4a_1x2_za16_bf16_bf16_0, svbfloat16_t, svbfloat16x2_t,
+ svmop4a_1x2_za16_bf16_bf16 (0, z0, z4),
+ svmop4a_za16 (0, z0, z4));
+
+/*
+** mop4a_1x2_za16_bf16_bf16_1:
+** ...
+** bfmop4a za1\.h, z0\.h, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4a_1x2_za16_bf16_bf16_1, svbfloat16_t, svbfloat16x2_t,
+ svmop4a_1x2_za16_bf16_bf16 (1, z0, z4),
+ svmop4a_za16 (1, z0, z4));
+
+/*
+** mop4a_2x1_za16_bf16_bf16_0:
+** ...
+** bfmop4a za0\.h, {z0\.h - z1\.h}, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4a_2x1_za16_bf16_bf16_0, svbfloat16x2_t, svbfloat16_t,
+ svmop4a_2x1_za16_bf16_bf16 (0, z0, z4),
+ svmop4a_za16 (0, z0, z4));
+
+/*
+** mop4a_2x1_za16_bf16_bf16_1:
+** ...
+** bfmop4a za1\.h, {z0\.h - z1\.h}, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4a_2x1_za16_bf16_bf16_1, svbfloat16x2_t, svbfloat16_t,
+ svmop4a_2x1_za16_bf16_bf16 (1, z0, z4),
+ svmop4a_za16 (1, z0, z4));
+
+/*
+** mop4a_2x2_za16_bf16_bf16_0:
+** ...
+** bfmop4a za0\.h, {z0\.h - z1\.h}, {z30\.h - z31\.h}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_2x2_za16_bf16_bf16_0, svbfloat16x2_t,
+ svmop4a_2x2_za16_bf16_bf16 (0, z0, z1),
+ svmop4a_za16 (0, z0, z1));
+
+/*
+** mop4a_2x2_za16_bf16_bf16_1:
+** ...
+** bfmop4a za1\.h, {z0\.h - z1\.h}, {z30\.h - z31\.h}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_2x2_za16_bf16_bf16_1, svbfloat16x2_t,
+ svmop4a_2x2_za16_bf16_bf16 (1, z0, z1),
+ svmop4a_za16 (1, z0, z1));
diff --git
a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za16_f16_f16.c
b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za16_f16_f16.c
new file mode 100644
index 00000000000..d6bddc8d842
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za16_f16_f16.c
@@ -0,0 +1,85 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#pragma GCC target "+sve2,+sme-mop4,+sme-f16f16"
+#include <arm_sme.h>
+#include "test_sme2_acle.h"
+
+/*
+** mop4a_1x1_za16_f16_f16_0:
+** ...
+** fmop4a za0\.h, z0\.h, z30\.h
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_1x1_za16_f16_f16_0, svfloat16_t,
+ svmop4a_1x1_za16_f16_f16 (0, z0, z1),
+ svmop4a_za16 (0, z0, z1));
+
+/*
+** mop4a_1x1_za16_f16_f16_1:
+** ...
+** fmop4a za1\.h, z0\.h, z30\.h
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_1x1_za16_f16_f16_1, svfloat16_t,
+ svmop4a_1x1_za16_f16_f16 (1, z0, z1),
+ svmop4a_za16 (1, z0, z1));
+
+/*
+** mop4a_1x2_za16_f16_f16_0:
+** ...
+** fmop4a za0\.h, z0\.h, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4a_1x2_za16_f16_f16_0, svfloat16_t, svfloat16x2_t,
+ svmop4a_1x2_za16_f16_f16 (0, z0, z4),
+ svmop4a_za16 (0, z0, z4));
+
+/*
+** mop4a_1x2_za16_f16_f16_1:
+** ...
+** fmop4a za1\.h, z0\.h, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4a_1x2_za16_f16_f16_1, svfloat16_t, svfloat16x2_t,
+ svmop4a_1x2_za16_f16_f16 (1, z0, z4),
+ svmop4a_za16 (1, z0, z4));
+
+/*
+** mop4a_2x1_za16_f16_f16_0:
+** ...
+** fmop4a za0\.h, {z0\.h - z1\.h}, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4a_2x1_za16_f16_f16_0, svfloat16x2_t, svfloat16_t,
+ svmop4a_2x1_za16_f16_f16 (0, z0, z4),
+ svmop4a_za16 (0, z0, z4));
+
+/*
+** mop4a_2x1_za16_f16_f16_1:
+** ...
+** fmop4a za1\.h, {z0\.h - z1\.h}, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4a_2x1_za16_f16_f16_1, svfloat16x2_t, svfloat16_t,
+ svmop4a_2x1_za16_f16_f16 (1, z0, z4),
+ svmop4a_za16 (1, z0, z4));
+
+/*
+** mop4a_2x2_za16_f16_f16_0:
+** ...
+** fmop4a za0\.h, {z0\.h - z1\.h}, {z30\.h - z31\.h}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_2x2_za16_f16_f16_0, svfloat16x2_t,
+ svmop4a_2x2_za16_f16_f16 (0, z0, z1),
+ svmop4a_za16 (0, z0, z1));
+
+/*
+** mop4a_2x2_za16_f16_f16_1:
+** ...
+** fmop4a za1\.h, {z0\.h - z1\.h}, {z30\.h - z31\.h}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_2x2_za16_f16_f16_1, svfloat16x2_t,
+ svmop4a_2x2_za16_f16_f16 (1, z0, z1),
+ svmop4a_za16 (1, z0, z1));
diff --git
a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za16_mf8_mf8.c
b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za16_mf8_mf8.c
new file mode 100644
index 00000000000..9f838e25fd1
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za16_mf8_mf8.c
@@ -0,0 +1,85 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#pragma GCC target "+sve2,+sme-mop4,+sme-f8f16"
+#include <arm_sme.h>
+#include "test_sme2_acle.h"
+
+/*
+** mop4a_1x1_za16_mf8_mf8_0:
+** ...
+** fmop4a za0\.h, z0\.b, z30\.b
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_1x1_za16_mf8_mf8_0, svmfloat8_t,
+ svmop4a_1x1_za16_mf8_mf8_fpm (0, z0, z1, fpm0),
+ svmop4a_za16_fpm (0, z0, z1, fpm0));
+
+/*
+** mop4a_1x1_za16_mf8_mf8_1:
+** ...
+** fmop4a za1\.h, z0\.b, z30\.b
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_1x1_za16_mf8_mf8_1, svmfloat8_t,
+ svmop4a_1x1_za16_mf8_mf8_fpm (1, z0, z1, fpm0),
+ svmop4a_za16_fpm (1, z0, z1, fpm0));
+
+/*
+** mop4a_1x2_za16_mf8_mf8_0:
+** ...
+** fmop4a za0\.h, z0\.b, {z30\.b - z31\.b}
+** ret
+*/
+TEST_DUAL_ZA (mop4a_1x2_za16_mf8_mf8_0, svmfloat8_t, svmfloat8x2_t,
+ svmop4a_1x2_za16_mf8_mf8_fpm (0, z0, z4, fpm0),
+ svmop4a_za16_fpm (0, z0, z4, fpm0));
+
+/*
+** mop4a_1x2_za16_mf8_mf8_1:
+** ...
+** fmop4a za1\.h, z0\.b, {z30\.b - z31\.b}
+** ret
+*/
+TEST_DUAL_ZA (mop4a_1x2_za16_mf8_mf8_1, svmfloat8_t, svmfloat8x2_t,
+ svmop4a_1x2_za16_mf8_mf8_fpm (1, z0, z4, fpm0),
+ svmop4a_za16_fpm (1, z0, z4, fpm0));
+
+/*
+** mop4a_2x1_za16_mf8_mf8_0:
+** ...
+** fmop4a za0\.h, {z0\.b - z1\.b}, z30\.b
+** ret
+*/
+TEST_DUAL_ZA (mop4a_2x1_za16_mf8_mf8_0, svmfloat8x2_t, svmfloat8_t,
+ svmop4a_2x1_za16_mf8_mf8_fpm (0, z0, z4, fpm0),
+ svmop4a_za16_fpm (0, z0, z4, fpm0));
+
+/*
+** mop4a_2x1_za16_mf8_mf8_1:
+** ...
+** fmop4a za1\.h, {z0\.b - z1\.b}, z30\.b
+** ret
+*/
+TEST_DUAL_ZA (mop4a_2x1_za16_mf8_mf8_1, svmfloat8x2_t, svmfloat8_t,
+ svmop4a_2x1_za16_mf8_mf8_fpm (1, z0, z4, fpm0),
+ svmop4a_za16_fpm (1, z0, z4, fpm0));
+
+/*
+** mop4a_2x2_za16_mf8_mf8_0:
+** ...
+** fmop4a za0\.h, {z0\.b - z1\.b}, {z30\.b - z31\.b}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_2x2_za16_mf8_mf8_0, svmfloat8x2_t,
+ svmop4a_2x2_za16_mf8_mf8_fpm (0, z0, z1, fpm0),
+ svmop4a_za16_fpm (0, z0, z1, fpm0));
+
+/*
+** mop4a_2x2_za16_mf8_mf8_1:
+** ...
+** fmop4a za1\.h, {z0\.b - z1\.b}, {z30\.b - z31\.b}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_2x2_za16_mf8_mf8_1, svmfloat8x2_t,
+ svmop4a_2x2_za16_mf8_mf8_fpm (1, z0, z1, fpm0),
+ svmop4a_za16_fpm (1, z0, z1, fpm0));
diff --git
a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za32_bf16_bf16.c
b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za32_bf16_bf16.c
new file mode 100644
index 00000000000..a632bd7eae1
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za32_bf16_bf16.c
@@ -0,0 +1,85 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#pragma GCC target "+sve2,+sme-mop4,+sme-b16b16"
+#include <arm_sme.h>
+#include "test_sme2_acle.h"
+
+/*
+** mop4a_1x1_za32_bf16_bf16_0:
+** ...
+** bfmop4a za0\.s, z0\.h, z30\.h
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_1x1_za32_bf16_bf16_0, svbfloat16_t,
+ svmop4a_1x1_za32_bf16_bf16 (0, z0, z1),
+ svmop4a_za32 (0, z0, z1));
+
+/*
+** mop4a_1x1_za32_bf16_bf16_3:
+** ...
+** bfmop4a za3\.s, z0\.h, z30\.h
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_1x1_za32_bf16_bf16_3, svbfloat16_t,
+ svmop4a_1x1_za32_bf16_bf16 (3, z0, z1),
+ svmop4a_za32 (3, z0, z1));
+
+/*
+** mop4a_1x2_za32_bf16_bf16_0:
+** ...
+** bfmop4a za0\.s, z0\.h, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4a_1x2_za32_bf16_bf16_0, svbfloat16_t, svbfloat16x2_t,
+ svmop4a_1x2_za32_bf16_bf16 (0, z0, z4),
+ svmop4a_za32 (0, z0, z4));
+
+/*
+** mop4a_1x2_za32_bf16_bf16_3:
+** ...
+** bfmop4a za3\.s, z0\.h, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4a_1x2_za32_bf16_bf16_3, svbfloat16_t, svbfloat16x2_t,
+ svmop4a_1x2_za32_bf16_bf16 (3, z0, z4),
+ svmop4a_za32 (3, z0, z4));
+
+/*
+** mop4a_2x1_za32_bf16_bf16_0:
+** ...
+** bfmop4a za0\.s, {z0\.h - z1\.h}, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4a_2x1_za32_bf16_bf16_0, svbfloat16x2_t, svbfloat16_t,
+ svmop4a_2x1_za32_bf16_bf16 (0, z0, z4),
+ svmop4a_za32 (0, z0, z4));
+
+/*
+** mop4a_2x1_za32_bf16_bf16_3:
+** ...
+** bfmop4a za3\.s, {z0\.h - z1\.h}, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4a_2x1_za32_bf16_bf16_3, svbfloat16x2_t, svbfloat16_t,
+ svmop4a_2x1_za32_bf16_bf16 (3, z0, z4),
+ svmop4a_za32 (3, z0, z4));
+
+/*
+** mop4a_2x2_za32_bf16_bf16_0:
+** ...
+** bfmop4a za0\.s, {z0\.h - z1\.h}, {z30\.h - z31\.h}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_2x2_za32_bf16_bf16_0, svbfloat16x2_t,
+ svmop4a_2x2_za32_bf16_bf16 (0, z0, z1),
+ svmop4a_za32 (0, z0, z1));
+
+/*
+** mop4a_2x2_za32_bf16_bf16_3:
+** ...
+** bfmop4a za3\.s, {z0\.h - z1\.h}, {z30\.h - z31\.h}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_2x2_za32_bf16_bf16_3, svbfloat16x2_t,
+ svmop4a_2x2_za32_bf16_bf16 (3, z0, z1),
+ svmop4a_za32 (3, z0, z1));
diff --git
a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za32_f16_f16.c
b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za32_f16_f16.c
new file mode 100644
index 00000000000..bf5300243bb
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za32_f16_f16.c
@@ -0,0 +1,85 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#pragma GCC target "+sve2,+sme-mop4,+sme-f16f16"
+#include <arm_sme.h>
+#include "test_sme2_acle.h"
+
+/*
+** mop4a_1x1_za32_f16_f16_0:
+** ...
+** fmop4a za0\.s, z0\.h, z30\.h
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_1x1_za32_f16_f16_0, svfloat16_t,
+ svmop4a_1x1_za32_f16_f16 (0, z0, z1),
+ svmop4a_za32 (0, z0, z1));
+
+/*
+** mop4a_1x1_za32_f16_f16_3:
+** ...
+** fmop4a za3\.s, z0\.h, z30\.h
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_1x1_za32_f16_f16_3, svfloat16_t,
+ svmop4a_1x1_za32_f16_f16 (3, z0, z1),
+ svmop4a_za32 (3, z0, z1));
+
+/*
+** mop4a_1x2_za32_f16_f16_0:
+** ...
+** fmop4a za0\.s, z0\.h, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4a_1x2_za32_f16_f16_0, svfloat16_t, svfloat16x2_t,
+ svmop4a_1x2_za32_f16_f16 (0, z0, z4),
+ svmop4a_za32 (0, z0, z4));
+
+/*
+** mop4a_1x2_za32_f16_f16_3:
+** ...
+** fmop4a za3\.s, z0\.h, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4a_1x2_za32_f16_f16_3, svfloat16_t, svfloat16x2_t,
+ svmop4a_1x2_za32_f16_f16 (3, z0, z4),
+ svmop4a_za32 (3, z0, z4));
+
+/*
+** mop4a_2x1_za32_f16_f16_0:
+** ...
+** fmop4a za0\.s, {z0\.h - z1\.h}, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4a_2x1_za32_f16_f16_0, svfloat16x2_t, svfloat16_t,
+ svmop4a_2x1_za32_f16_f16 (0, z0, z4),
+ svmop4a_za32 (0, z0, z4));
+
+/*
+** mop4a_2x1_za32_f16_f16_3:
+** ...
+** fmop4a za3\.s, {z0\.h - z1\.h}, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4a_2x1_za32_f16_f16_3, svfloat16x2_t, svfloat16_t,
+ svmop4a_2x1_za32_f16_f16 (3, z0, z4),
+ svmop4a_za32 (3, z0, z4));
+
+/*
+** mop4a_2x2_za32_f16_f16_0:
+** ...
+** fmop4a za0\.s, {z0\.h - z1\.h}, {z30\.h - z31\.h}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_2x2_za32_f16_f16_0, svfloat16x2_t,
+ svmop4a_2x2_za32_f16_f16 (0, z0, z1),
+ svmop4a_za32 (0, z0, z1));
+
+/*
+** mop4a_2x2_za32_f16_f16_3:
+** ...
+** fmop4a za3\.s, {z0\.h - z1\.h}, {z30\.h - z31\.h}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_2x2_za32_f16_f16_3, svfloat16x2_t,
+ svmop4a_2x2_za32_f16_f16 (3, z0, z1),
+ svmop4a_za32 (3, z0, z1));
diff --git
a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za32_f32_f32.c
b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za32_f32_f32.c
new file mode 100644
index 00000000000..6d422721e68
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za32_f32_f32.c
@@ -0,0 +1,85 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#pragma GCC target "+sve2,+sme-mop4"
+#include <arm_sme.h>
+#include "test_sme2_acle.h"
+
+/*
+** mop4a_1x1_za32_f32_f32_0:
+** ...
+** fmop4a za0\.s, z0\.s, z30\.s
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_1x1_za32_f32_f32_0, svfloat32_t,
+ svmop4a_1x1_za32_f32_f32 (0, z0, z1),
+ svmop4a_za32 (0, z0, z1));
+
+/*
+** mop4a_1x1_za32_f32_f32_3:
+** ...
+** fmop4a za3\.s, z0\.s, z30\.s
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_1x1_za32_f32_f32_3, svfloat32_t,
+ svmop4a_1x1_za32_f32_f32 (3, z0, z1),
+ svmop4a_za32 (3, z0, z1));
+
+/*
+** mop4a_1x2_za32_f32_f32_0:
+** ...
+** fmop4a za0\.s, z0\.s, {z30\.s - z31\.s}
+** ret
+*/
+TEST_DUAL_ZA (mop4a_1x2_za32_f32_f32_0, svfloat32_t, svfloat32x2_t,
+ svmop4a_1x2_za32_f32_f32 (0, z0, z4),
+ svmop4a_za32 (0, z0, z4));
+
+/*
+** mop4a_1x2_za32_f32_f32_3:
+** ...
+** fmop4a za3\.s, z0\.s, {z30\.s - z31\.s}
+** ret
+*/
+TEST_DUAL_ZA (mop4a_1x2_za32_f32_f32_3, svfloat32_t, svfloat32x2_t,
+ svmop4a_1x2_za32_f32_f32 (3, z0, z4),
+ svmop4a_za32 (3, z0, z4));
+
+/*
+** mop4a_2x1_za32_f32_f32_0:
+** ...
+** fmop4a za0\.s, {z0\.s - z1\.s}, z30\.s
+** ret
+*/
+TEST_DUAL_ZA (mop4a_2x1_za32_f32_f32_0, svfloat32x2_t, svfloat32_t,
+ svmop4a_2x1_za32_f32_f32 (0, z0, z4),
+ svmop4a_za32 (0, z0, z4));
+
+/*
+** mop4a_2x1_za32_f32_f32_3:
+** ...
+** fmop4a za3\.s, {z0\.s - z1\.s}, z30\.s
+** ret
+*/
+TEST_DUAL_ZA (mop4a_2x1_za32_f32_f32_3, svfloat32x2_t, svfloat32_t,
+ svmop4a_2x1_za32_f32_f32 (3, z0, z4),
+ svmop4a_za32 (3, z0, z4));
+
+/*
+** mop4a_2x2_za32_f32_f32_0:
+** ...
+** fmop4a za0\.s, {z0\.s - z1\.s}, {z30\.s - z31\.s}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_2x2_za32_f32_f32_0, svfloat32x2_t,
+ svmop4a_2x2_za32_f32_f32 (0, z0, z1),
+ svmop4a_za32 (0, z0, z1));
+
+/*
+** mop4a_2x2_za32_f32_f32_3:
+** ...
+** fmop4a za3\.s, {z0\.s - z1\.s}, {z30\.s - z31\.s}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_2x2_za32_f32_f32_3, svfloat32x2_t,
+ svmop4a_2x2_za32_f32_f32 (3, z0, z1),
+ svmop4a_za32 (3, z0, z1));
diff --git
a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za32_mf8_mf8.c
b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za32_mf8_mf8.c
new file mode 100644
index 00000000000..c2d0e2cbd65
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za32_mf8_mf8.c
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#pragma GCC target "+sve2,+sme-mop4,+sme-f8f32"
+#include <arm_sme.h>
+#include "test_sme2_acle.h"
+
+/*
+** mop4a_1x1_za32_mf8_mf8_0:
+** ...
+** fmop4a za0\.s, z0\.b, z30\.b
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_1x1_za32_mf8_mf8_0, svmfloat8_t,
+ svmop4a_1x1_za32_mf8_mf8_fpm (0, z0, z1, fpm0),
+ svmop4a_za32_fpm (0, z0, z1, fpm0));
+
+/*
+** mop4a_1x1_za32_mf8_mf8_3:
+** ...
+** fmop4a za3\.s, z0\.b, z30\.b
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_1x1_za32_mf8_mf8_3, svmfloat8_t,
+ svmop4a_1x1_za32_mf8_mf8_fpm (3, z0, z1, fpm0),
+ svmop4a_za32_fpm (3, z0, z1, fpm0));
+
+/*
+** mop4a_1x2_za32_mf8_mf8_0:
+** ...
+** fmop4a za0\.s, z0\.b, {z30\.b - z31\.b}
+** ret
+*/
+TEST_DUAL_ZA (mop4a_1x2_za32_mf8_mf8_0, svmfloat8_t, svmfloat8x2_t,
+ svmop4a_1x2_za32_mf8_mf8_fpm (0, z0, z4, fpm0),
+ svmop4a_za32_fpm (0, z0, z4, fpm0));
+
+/*
+** mop4a_1x2_za32_mf8_mf8_3:
+** ...
+** fmop4a za3\.s, z0\.b, {z30\.b - z31\.b}
+** ret
+*/
+TEST_DUAL_ZA (mop4a_1x2_za32_mf8_mf8_3, svmfloat8_t, svmfloat8x2_t,
+ svmop4a_1x2_za32_mf8_mf8_fpm (3, z0, z4, fpm0),
+ svmop4a_za32_fpm (3, z0, z4, fpm0));
+
+/*
+** mop4a_2x1_za32_mf8_mf8_0:
+** ...
+** fmop4a za0\.s, {z0\.b - z1\.b}, z30\.b
+** ret
+*/
+TEST_DUAL_ZA (mop4a_2x1_za32_mf8_mf8_0, svmfloat8x2_t, svmfloat8_t,
+ svmop4a_2x1_za32_mf8_mf8_fpm (0, z0, z4, fpm0),
+ svmop4a_za32_fpm (0, z0, z4, fpm0));
+
+/*
+** mop4a_2x1_za32_mf8_mf8_3:
+** ...
+** fmop4a za3\.s, {z0\.b - z1\.b}, z30\.b
+** ret
+*/
+TEST_DUAL_ZA (mop4a_2x1_za32_mf8_mf8_3, svmfloat8x2_t, svmfloat8_t,
+ svmop4a_2x1_za32_mf8_mf8_fpm (3, z0, z4, fpm0),
+ svmop4a_za32_fpm (3, z0, z4, fpm0));
+
+/*
+** mop4a_2x2_za32_mf8_mf8_0:
+** ...
+** fmop4a za0\.s, {z0\.b - z1\.b}, {z30\.b - z31\.b}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_2x2_za32_mf8_mf8_0, svmfloat8x2_t,
+ svmop4a_2x2_za32_mf8_mf8_fpm (0, z0, z1, fpm0),
+ svmop4a_za32_fpm (0, z0, z1, fpm0));
+
+/*
+** mop4a_2x2_za32_mf8_mf8_3:
+** ...
+** fmop4a za3\.s, {z0\.b - z1\.b}, {z30\.b - z31\.b}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_2x2_za32_mf8_mf8_3, svmfloat8x2_t,
+ svmop4a_2x2_za32_mf8_mf8_fpm (3, z0, z1, fpm0),
+ svmop4a_za32_fpm (3, z0, z1, fpm0));
+
diff --git
a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za32_s16_s16.c
b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za32_s16_s16.c
new file mode 100644
index 00000000000..d75be023510
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za32_s16_s16.c
@@ -0,0 +1,85 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#pragma GCC target "+sve2,+sme-mop4"
+#include <arm_sme.h>
+#include "test_sme2_acle.h"
+
+/*
+** mop4a_1x1_za32_s16_s16_0:
+** ...
+** smop4a za0\.s, z0\.h, z30\.h
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_1x1_za32_s16_s16_0, svint16_t,
+ svmop4a_1x1_za32_s16_s16 (0, z0, z1),
+ svmop4a_za32 (0, z0, z1));
+
+/*
+** mop4a_1x1_za32_s16_s16_3:
+** ...
+** smop4a za3\.s, z0\.h, z30\.h
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_1x1_za32_s16_s16_3, svint16_t,
+ svmop4a_1x1_za32_s16_s16 (3, z0, z1),
+ svmop4a_za32 (3, z0, z1));
+
+/*
+** mop4a_1x2_za32_s16_s16_0:
+** ...
+** smop4a za0\.s, z0\.h, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4a_1x2_za32_s16_s16_0, svint16_t, svint16x2_t,
+ svmop4a_1x2_za32_s16_s16 (0, z0, z4),
+ svmop4a_za32 (0, z0, z4));
+
+/*
+** mop4a_1x2_za32_s16_s16_3:
+** ...
+** smop4a za3\.s, z0\.h, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4a_1x2_za32_s16_s16_3, svint16_t, svint16x2_t,
+ svmop4a_1x2_za32_s16_s16 (3, z0, z4),
+ svmop4a_za32 (3, z0, z4));
+
+/*
+** mop4a_2x1_za32_s16_s16_0:
+** ...
+** smop4a za0\.s, {z0\.h - z1\.h}, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4a_2x1_za32_s16_s16_0, svint16x2_t, svint16_t,
+ svmop4a_2x1_za32_s16_s16 (0, z0, z4),
+ svmop4a_za32 (0, z0, z4));
+
+/*
+** mop4a_2x1_za32_s16_s16_3:
+** ...
+** smop4a za3\.s, {z0\.h - z1\.h}, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4a_2x1_za32_s16_s16_3, svint16x2_t, svint16_t,
+ svmop4a_2x1_za32_s16_s16 (3, z0, z4),
+ svmop4a_za32 (3, z0, z4));
+
+/*
+** mop4a_2x2_za32_s16_s16_0:
+** ...
+** smop4a za0\.s, {z0\.h - z1\.h}, {z30\.h - z31\.h}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_2x2_za32_s16_s16_0, svint16x2_t,
+ svmop4a_2x2_za32_s16_s16 (0, z0, z1),
+ svmop4a_za32 (0, z0, z1));
+
+/*
+** mop4a_2x2_za32_s16_s16_3:
+** ...
+** smop4a za3\.s, {z0\.h - z1\.h}, {z30\.h - z31\.h}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_2x2_za32_s16_s16_3, svint16x2_t,
+ svmop4a_2x2_za32_s16_s16 (3, z0, z1),
+ svmop4a_za32 (3, z0, z1));
diff --git a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za32_s8_s8.c
b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za32_s8_s8.c
new file mode 100644
index 00000000000..7963b71e6ca
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za32_s8_s8.c
@@ -0,0 +1,85 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#pragma GCC target "+sve2,+sme-mop4"
+#include <arm_sme.h>
+#include "test_sme2_acle.h"
+
+/*
+** mop4a_1x1_za32_s8_s8_0:
+** ...
+** smop4a za0\.s, z0\.b, z30\.b
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_1x1_za32_s8_s8_0, svint8_t,
+ svmop4a_1x1_za32_s8_s8 (0, z0, z1),
+ svmop4a_za32 (0, z0, z1));
+
+/*
+** mop4a_1x1_za32_s8_s8_3:
+** ...
+** smop4a za3\.s, z0\.b, z30\.b
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_1x1_za32_s8_s8_3, svint8_t,
+ svmop4a_1x1_za32_s8_s8 (3, z0, z1),
+ svmop4a_za32 (3, z0, z1));
+
+/*
+** mop4a_1x2_za32_s8_s8_0:
+** ...
+** smop4a za0\.s, z0\.b, {z30\.b - z31\.b}
+** ret
+*/
+TEST_DUAL_ZA (mop4a_1x2_za32_s8_s8_0, svint8_t, svint8x2_t,
+ svmop4a_1x2_za32_s8_s8 (0, z0, z4),
+ svmop4a_za32 (0, z0, z4));
+
+/*
+** mop4a_1x2_za32_s8_s8_3:
+** ...
+** smop4a za3\.s, z0\.b, {z30\.b - z31\.b}
+** ret
+*/
+TEST_DUAL_ZA (mop4a_1x2_za32_s8_s8_3, svint8_t, svint8x2_t,
+ svmop4a_1x2_za32_s8_s8 (3, z0, z4),
+ svmop4a_za32 (3, z0, z4));
+
+/*
+** mop4a_2x1_za32_s8_s8_0:
+** ...
+** smop4a za0\.s, {z0\.b - z1\.b}, z30\.b
+** ret
+*/
+TEST_DUAL_ZA (mop4a_2x1_za32_s8_s8_0, svint8x2_t, svint8_t,
+ svmop4a_2x1_za32_s8_s8 (0, z0, z4),
+ svmop4a_za32 (0, z0, z4));
+
+/*
+** mop4a_2x1_za32_s8_s8_3:
+** ...
+** smop4a za3\.s, {z0\.b - z1\.b}, z30\.b
+** ret
+*/
+TEST_DUAL_ZA (mop4a_2x1_za32_s8_s8_3, svint8x2_t, svint8_t,
+ svmop4a_2x1_za32_s8_s8 (3, z0, z4),
+ svmop4a_za32 (3, z0, z4));
+
+/*
+** mop4a_2x2_za32_s8_s8_0:
+** ...
+** smop4a za0\.s, {z0\.b - z1\.b}, {z30\.b - z31\.b}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_2x2_za32_s8_s8_0, svint8x2_t,
+ svmop4a_2x2_za32_s8_s8 (0, z0, z1),
+ svmop4a_za32 (0, z0, z1));
+
+/*
+** mop4a_2x2_za32_s8_s8_3:
+** ...
+** smop4a za3\.s, {z0\.b - z1\.b}, {z30\.b - z31\.b}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_2x2_za32_s8_s8_3, svint8x2_t,
+ svmop4a_2x2_za32_s8_s8 (3, z0, z1),
+ svmop4a_za32 (3, z0, z1));
diff --git a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za32_s8_u8.c
b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za32_s8_u8.c
new file mode 100644
index 00000000000..0313d6be245
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za32_s8_u8.c
@@ -0,0 +1,85 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#pragma GCC target "+sve2,+sme-mop4"
+#include <arm_sme.h>
+#include "test_sme2_acle.h"
+
+/*
+** mop4a_1x1_za32_s8_u8_0:
+** ...
+** sumop4a za0\.s, z0\.b, z30\.b
+** ret
+*/
+TEST_DUAL_ZA (mop4a_1x1_za32_s8_u8_0, svint8_t, svuint8_t,
+ svmop4a_1x1_za32_s8_u8 (0, z0, z4),
+ svmop4a_za32 (0, z0, z4));
+
+/*
+** mop4a_1x1_za32_s8_u8_3:
+** ...
+** sumop4a za3\.s, z0\.b, z30\.b
+** ret
+*/
+TEST_DUAL_ZA (mop4a_1x1_za32_s8_u8_3, svint8_t, svuint8_t,
+ svmop4a_1x1_za32_s8_u8 (3, z0, z4),
+ svmop4a_za32 (3, z0, z4));
+
+/*
+** mop4a_1x2_za32_s8_u8_0:
+** ...
+** sumop4a za0\.s, z0\.b, {z30\.b - z31\.b}
+** ret
+*/
+TEST_DUAL_ZA (mop4a_1x2_za32_s8_u8_0, svint8_t, svuint8x2_t,
+ svmop4a_1x2_za32_s8_u8 (0, z0, z4),
+ svmop4a_za32 (0, z0, z4));
+
+/*
+** mop4a_1x2_za32_s8_u8_3:
+** ...
+** sumop4a za3\.s, z0\.b, {z30\.b - z31\.b}
+** ret
+*/
+TEST_DUAL_ZA (mop4a_1x2_za32_s8_u8_3, svint8_t, svuint8x2_t,
+ svmop4a_1x2_za32_s8_u8 (3, z0, z4),
+ svmop4a_za32 (3, z0, z4));
+
+/*
+** mop4a_2x1_za32_s8_u8_0:
+** ...
+** sumop4a za0\.s, {z0\.b - z1\.b}, z30\.b
+** ret
+*/
+TEST_DUAL_ZA (mop4a_2x1_za32_s8_u8_0, svint8x2_t, svuint8_t,
+ svmop4a_2x1_za32_s8_u8 (0, z0, z4),
+ svmop4a_za32 (0, z0, z4));
+
+/*
+** mop4a_2x1_za32_s8_u8_3:
+** ...
+** sumop4a za3\.s, {z0\.b - z1\.b}, z30\.b
+** ret
+*/
+TEST_DUAL_ZA (mop4a_2x1_za32_s8_u8_3, svint8x2_t, svuint8_t,
+ svmop4a_2x1_za32_s8_u8 (3, z0, z4),
+ svmop4a_za32 (3, z0, z4));
+
+/*
+** mop4a_2x2_za32_s8_u8_0:
+** ...
+** sumop4a za0\.s, {z0\.b - z1\.b}, {z30\.b - z31\.b}
+** ret
+*/
+TEST_DUAL_ZA (mop4a_2x2_za32_s8_u8_0, svint8x2_t, svuint8x2_t,
+ svmop4a_2x2_za32_s8_u8 (0, z0, z4),
+ svmop4a_za32 (0, z0, z4));
+
+/*
+** mop4a_2x2_za32_s8_u8_3:
+** ...
+** sumop4a za3\.s, {z0\.b - z1\.b}, {z30\.b - z31\.b}
+** ret
+*/
+TEST_DUAL_ZA (mop4a_2x2_za32_s8_u8_3, svint8x2_t, svuint8x2_t,
+ svmop4a_2x2_za32_s8_u8 (3, z0, z4),
+ svmop4a_za32 (3, z0, z4));
diff --git
a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za32_u16_u16.c
b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za32_u16_u16.c
new file mode 100644
index 00000000000..93caf879336
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za32_u16_u16.c
@@ -0,0 +1,85 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#pragma GCC target "+sve2,+sme-mop4"
+#include <arm_sme.h>
+#include "test_sme2_acle.h"
+
+/*
+** mop4a_1x1_za32_u16_u16_0:
+** ...
+** umop4a za0\.s, z0\.h, z30\.h
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_1x1_za32_u16_u16_0, svuint16_t,
+ svmop4a_1x1_za32_u16_u16 (0, z0, z1),
+ svmop4a_za32 (0, z0, z1));
+
+/*
+** mop4a_1x1_za32_u16_u16_3:
+** ...
+** umop4a za3\.s, z0\.h, z30\.h
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_1x1_za32_u16_u16_3, svuint16_t,
+ svmop4a_1x1_za32_u16_u16 (3, z0, z1),
+ svmop4a_za32 (3, z0, z1));
+
+/*
+** mop4a_1x2_za32_u16_u16_0:
+** ...
+** umop4a za0\.s, z0\.h, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4a_1x2_za32_u16_u16_0, svuint16_t, svuint16x2_t,
+ svmop4a_1x2_za32_u16_u16 (0, z0, z4),
+ svmop4a_za32 (0, z0, z4));
+
+/*
+** mop4a_1x2_za32_u16_u16_3:
+** ...
+** umop4a za3\.s, z0\.h, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4a_1x2_za32_u16_u16_3, svuint16_t, svuint16x2_t,
+ svmop4a_1x2_za32_u16_u16 (3, z0, z4),
+ svmop4a_za32 (3, z0, z4));
+
+/*
+** mop4a_2x1_za32_u16_u16_0:
+** ...
+** umop4a za0\.s, {z0\.h - z1\.h}, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4a_2x1_za32_u16_u16_0, svuint16x2_t, svuint16_t,
+ svmop4a_2x1_za32_u16_u16 (0, z0, z4),
+ svmop4a_za32 (0, z0, z4));
+
+/*
+** mop4a_2x1_za32_u16_u16_3:
+** ...
+** umop4a za3\.s, {z0\.h - z1\.h}, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4a_2x1_za32_u16_u16_3, svuint16x2_t, svuint16_t,
+ svmop4a_2x1_za32_u16_u16 (3, z0, z4),
+ svmop4a_za32 (3, z0, z4));
+
+/*
+** mop4a_2x2_za32_u16_u16_0:
+** ...
+** umop4a za0\.s, {z0\.h - z1\.h}, {z30\.h - z31\.h}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_2x2_za32_u16_u16_0, svuint16x2_t,
+ svmop4a_2x2_za32_u16_u16 (0, z0, z1),
+ svmop4a_za32 (0, z0, z1));
+
+/*
+** mop4a_2x2_za32_u16_u16_3:
+** ...
+** umop4a za3\.s, {z0\.h - z1\.h}, {z30\.h - z31\.h}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_2x2_za32_u16_u16_3, svuint16x2_t,
+ svmop4a_2x2_za32_u16_u16 (3, z0, z1),
+ svmop4a_za32 (3, z0, z1));
diff --git a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za32_u8_s8.c
b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za32_u8_s8.c
new file mode 100644
index 00000000000..ea243532701
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za32_u8_s8.c
@@ -0,0 +1,85 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#pragma GCC target "+sve2,+sme-mop4"
+#include <arm_sme.h>
+#include "test_sme2_acle.h"
+
+/*
+** mop4a_1x1_za32_u8_s8_0:
+** ...
+** usmop4a za0\.s, z0\.b, z30\.b
+** ret
+*/
+TEST_DUAL_ZA (mop4a_1x1_za32_u8_s8_0, svuint8_t, svint8_t,
+ svmop4a_1x1_za32_u8_s8 (0, z0, z4),
+ svmop4a_za32 (0, z0, z4));
+
+/*
+** mop4a_1x1_za32_u8_s8_3:
+** ...
+** usmop4a za3\.s, z0\.b, z30\.b
+** ret
+*/
+TEST_DUAL_ZA (mop4a_1x1_za32_u8_s8_3, svuint8_t, svint8_t,
+ svmop4a_1x1_za32_u8_s8 (3, z0, z4),
+ svmop4a_za32 (3, z0, z4));
+
+/*
+** mop4a_1x2_za32_u8_s8_0:
+** ...
+** usmop4a za0\.s, z0\.b, {z30\.b - z31\.b}
+** ret
+*/
+TEST_DUAL_ZA (mop4a_1x2_za32_u8_s8_0, svuint8_t, svint8x2_t,
+ svmop4a_1x2_za32_u8_s8 (0, z0, z4),
+ svmop4a_za32 (0, z0, z4));
+
+/*
+** mop4a_1x2_za32_u8_s8_3:
+** ...
+** usmop4a za3\.s, z0\.b, {z30\.b - z31\.b}
+** ret
+*/
+TEST_DUAL_ZA (mop4a_1x2_za32_u8_s8_3, svuint8_t, svint8x2_t,
+ svmop4a_1x2_za32_u8_s8 (3, z0, z4),
+ svmop4a_za32 (3, z0, z4));
+
+/*
+** mop4a_2x1_za32_u8_s8_0:
+** ...
+** usmop4a za0\.s, {z0\.b - z1\.b}, z30\.b
+** ret
+*/
+TEST_DUAL_ZA (mop4a_2x1_za32_u8_s8_0, svuint8x2_t, svint8_t,
+ svmop4a_2x1_za32_u8_s8 (0, z0, z4),
+ svmop4a_za32 (0, z0, z4));
+
+/*
+** mop4a_2x1_za32_u8_s8_3:
+** ...
+** usmop4a za3\.s, {z0\.b - z1\.b}, z30\.b
+** ret
+*/
+TEST_DUAL_ZA (mop4a_2x1_za32_u8_s8_3, svuint8x2_t, svint8_t,
+ svmop4a_2x1_za32_u8_s8 (3, z0, z4),
+ svmop4a_za32 (3, z0, z4));
+
+/*
+** mop4a_2x2_za32_u8_s8_0:
+** ...
+** usmop4a za0\.s, {z0\.b - z1\.b}, {z30\.b - z31\.b}
+** ret
+*/
+TEST_DUAL_ZA (mop4a_2x2_za32_u8_s8_0, svuint8x2_t, svint8x2_t,
+ svmop4a_2x2_za32_u8_s8 (0, z0, z4),
+ svmop4a_za32 (0, z0, z4));
+
+/*
+** mop4a_2x2_za32_u8_s8_3:
+** ...
+** usmop4a za3\.s, {z0\.b - z1\.b}, {z30\.b - z31\.b}
+** ret
+*/
+TEST_DUAL_ZA (mop4a_2x2_za32_u8_s8_3, svuint8x2_t, svint8x2_t,
+ svmop4a_2x2_za32_u8_s8 (3, z0, z4),
+ svmop4a_za32 (3, z0, z4));
diff --git a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za32_u8_u8.c
b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za32_u8_u8.c
new file mode 100644
index 00000000000..cbe3e2c56f9
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za32_u8_u8.c
@@ -0,0 +1,85 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#pragma GCC target "+sve2,+sme-mop4"
+#include <arm_sme.h>
+#include "test_sme2_acle.h"
+
+/*
+** mop4a_1x1_za32_u8_u8_0:
+** ...
+** umop4a za0\.s, z0\.b, z30\.b
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_1x1_za32_u8_u8_0, svuint8_t,
+ svmop4a_1x1_za32_u8_u8 (0, z0, z1),
+ svmop4a_za32 (0, z0, z1));
+
+/*
+** mop4a_1x1_za32_u8_u8_3:
+** ...
+** umop4a za3\.s, z0\.b, z30\.b
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_1x1_za32_u8_u8_3, svuint8_t,
+ svmop4a_1x1_za32_u8_u8 (3, z0, z1),
+ svmop4a_za32 (3, z0, z1));
+
+/*
+** mop4a_1x2_za32_u8_u8_0:
+** ...
+** umop4a za0\.s, z0\.b, {z30\.b - z31\.b}
+** ret
+*/
+TEST_DUAL_ZA (mop4a_1x2_za32_u8_u8_0, svuint8_t, svuint8x2_t,
+ svmop4a_1x2_za32_u8_u8 (0, z0, z4),
+ svmop4a_za32 (0, z0, z4));
+
+/*
+** mop4a_1x2_za32_u8_u8_3:
+** ...
+** umop4a za3\.s, z0\.b, {z30\.b - z31\.b}
+** ret
+*/
+TEST_DUAL_ZA (mop4a_1x2_za32_u8_u8_3, svuint8_t, svuint8x2_t,
+ svmop4a_1x2_za32_u8_u8 (3, z0, z4),
+ svmop4a_za32 (3, z0, z4));
+
+/*
+** mop4a_2x1_za32_u8_u8_0:
+** ...
+** umop4a za0\.s, {z0\.b - z1\.b}, z30\.b
+** ret
+*/
+TEST_DUAL_ZA (mop4a_2x1_za32_u8_u8_0, svuint8x2_t, svuint8_t,
+ svmop4a_2x1_za32_u8_u8 (0, z0, z4),
+ svmop4a_za32 (0, z0, z4));
+
+/*
+** mop4a_2x1_za32_u8_u8_3:
+** ...
+** umop4a za3\.s, {z0\.b - z1\.b}, z30\.b
+** ret
+*/
+TEST_DUAL_ZA (mop4a_2x1_za32_u8_u8_3, svuint8x2_t, svuint8_t,
+ svmop4a_2x1_za32_u8_u8 (3, z0, z4),
+ svmop4a_za32 (3, z0, z4));
+
+/*
+** mop4a_2x2_za32_u8_u8_0:
+** ...
+** umop4a za0\.s, {z0\.b - z1\.b}, {z30\.b - z31\.b}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_2x2_za32_u8_u8_0, svuint8x2_t,
+ svmop4a_2x2_za32_u8_u8 (0, z0, z1),
+ svmop4a_za32 (0, z0, z1));
+
+/*
+** mop4a_2x2_za32_u8_u8_3:
+** ...
+** umop4a za3\.s, {z0\.b - z1\.b}, {z30\.b - z31\.b}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_2x2_za32_u8_u8_3, svuint8x2_t,
+ svmop4a_2x2_za32_u8_u8 (3, z0, z1),
+ svmop4a_za32 (3, z0, z1));
diff --git
a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za64_f64_f64.c
b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za64_f64_f64.c
new file mode 100644
index 00000000000..9ea4c735a8e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za64_f64_f64.c
@@ -0,0 +1,85 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#pragma GCC target "+sve2,+sme-mop4,+sme-f64f64"
+#include <arm_sme.h>
+#include "test_sme2_acle.h"
+
+/*
+** mop4a_1x1_za64_f64_f64_0:
+** ...
+** fmop4a za0\.d, z0\.d, z30\.d
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_1x1_za64_f64_f64_0, svfloat64_t,
+ svmop4a_1x1_za64_f64_f64 (0, z0, z1),
+ svmop4a_za64 (0, z0, z1));
+
+/*
+** mop4a_1x1_za64_f64_f64_7:
+** ...
+** fmop4a za7\.d, z0\.d, z30\.d
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_1x1_za64_f64_f64_7, svfloat64_t,
+ svmop4a_1x1_za64_f64_f64 (7, z0, z1),
+ svmop4a_za64 (7, z0, z1));
+
+/*
+** mop4a_1x2_za64_f64_f64_0:
+** ...
+** fmop4a za0\.d, z0\.d, {z30\.d - z31\.d}
+** ret
+*/
+TEST_DUAL_ZA (mop4a_1x2_za64_f64_f64_0, svfloat64_t, svfloat64x2_t,
+ svmop4a_1x2_za64_f64_f64 (0, z0, z4),
+ svmop4a_za64 (0, z0, z4));
+
+/*
+** mop4a_1x2_za64_f64_f64_7:
+** ...
+** fmop4a za7\.d, z0\.d, {z30\.d - z31\.d}
+** ret
+*/
+TEST_DUAL_ZA (mop4a_1x2_za64_f64_f64_7, svfloat64_t, svfloat64x2_t,
+ svmop4a_1x2_za64_f64_f64 (7, z0, z4),
+ svmop4a_za64 (7, z0, z4));
+
+/*
+** mop4a_2x1_za64_f64_f64_0:
+** ...
+** fmop4a za0\.d, {z0\.d - z1\.d}, z30\.d
+** ret
+*/
+TEST_DUAL_ZA (mop4a_2x1_za64_f64_f64_0, svfloat64x2_t, svfloat64_t,
+ svmop4a_2x1_za64_f64_f64 (0, z0, z4),
+ svmop4a_za64 (0, z0, z4));
+
+/*
+** mop4a_2x1_za64_f64_f64_7:
+** ...
+** fmop4a za7\.d, {z0\.d - z1\.d}, z30\.d
+** ret
+*/
+TEST_DUAL_ZA (mop4a_2x1_za64_f64_f64_7, svfloat64x2_t, svfloat64_t,
+ svmop4a_2x1_za64_f64_f64 (7, z0, z4),
+ svmop4a_za64 (7, z0, z4));
+
+/*
+** mop4a_2x2_za64_f64_f64_0:
+** ...
+** fmop4a za0\.d, {z0\.d - z1\.d}, {z30\.d - z31\.d}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_2x2_za64_f64_f64_0, svfloat64x2_t,
+ svmop4a_2x2_za64_f64_f64 (0, z0, z1),
+ svmop4a_za64 (0, z0, z1));
+
+/*
+** mop4a_2x2_za64_f64_f64_7:
+** ...
+** fmop4a za7\.d, {z0\.d - z1\.d}, {z30\.d - z31\.d}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_2x2_za64_f64_f64_7, svfloat64x2_t,
+ svmop4a_2x2_za64_f64_f64 (7, z0, z1),
+ svmop4a_za64 (7, z0, z1));
diff --git
a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za64_s16_s16.c
b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za64_s16_s16.c
new file mode 100644
index 00000000000..82713f37853
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za64_s16_s16.c
@@ -0,0 +1,85 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#pragma GCC target "+sve2,+sme-mop4,+sme-i16i64"
+#include <arm_sme.h>
+#include "test_sme2_acle.h"
+
+/*
+** mop4a_1x1_za64_s16_s16_0:
+** ...
+** smop4a za0\.d, z0\.h, z30\.h
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_1x1_za64_s16_s16_0, svint16_t,
+ svmop4a_1x1_za64_s16_s16 (0, z0, z1),
+ svmop4a_za64 (0, z0, z1));
+
+/*
+** mop4a_1x1_za64_s16_s16_7:
+** ...
+** smop4a za7\.d, z0\.h, z30\.h
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_1x1_za64_s16_s16_7, svint16_t,
+ svmop4a_1x1_za64_s16_s16 (7, z0, z1),
+ svmop4a_za64 (7, z0, z1));
+
+/*
+** mop4a_1x2_za64_s16_s16_0:
+** ...
+** smop4a za0\.d, z0\.h, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4a_1x2_za64_s16_s16_0, svint16_t, svint16x2_t,
+ svmop4a_1x2_za64_s16_s16 (0, z0, z4),
+ svmop4a_za64 (0, z0, z4));
+
+/*
+** mop4a_1x2_za64_s16_s16_7:
+** ...
+** smop4a za7\.d, z0\.h, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4a_1x2_za64_s16_s16_7, svint16_t, svint16x2_t,
+ svmop4a_1x2_za64_s16_s16 (7, z0, z4),
+ svmop4a_za64 (7, z0, z4));
+
+/*
+** mop4a_2x1_za64_s16_s16_0:
+** ...
+** smop4a za0\.d, {z0\.h - z1\.h}, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4a_2x1_za64_s16_s16_0, svint16x2_t, svint16_t,
+ svmop4a_2x1_za64_s16_s16 (0, z0, z4),
+ svmop4a_za64 (0, z0, z4));
+
+/*
+** mop4a_2x1_za64_s16_s16_7:
+** ...
+** smop4a za7\.d, {z0\.h - z1\.h}, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4a_2x1_za64_s16_s16_7, svint16x2_t, svint16_t,
+ svmop4a_2x1_za64_s16_s16 (7, z0, z4),
+ svmop4a_za64 (7, z0, z4));
+
+/*
+** mop4a_2x2_za64_s16_s16_0:
+** ...
+** smop4a za0\.d, {z0\.h - z1\.h}, {z30\.h - z31\.h}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_2x2_za64_s16_s16_0, svint16x2_t,
+ svmop4a_2x2_za64_s16_s16 (0, z0, z1),
+ svmop4a_za64 (0, z0, z1));
+
+/*
+** mop4a_2x2_za64_s16_s16_7:
+** ...
+** smop4a za7\.d, {z0\.h - z1\.h}, {z30\.h - z31\.h}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_2x2_za64_s16_s16_7, svint16x2_t,
+ svmop4a_2x2_za64_s16_s16 (7, z0, z1),
+ svmop4a_za64 (7, z0, z1));
diff --git
a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za64_s16_u16.c
b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za64_s16_u16.c
new file mode 100644
index 00000000000..8d0c65c8d5a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za64_s16_u16.c
@@ -0,0 +1,85 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#pragma GCC target "+sve2,+sme-mop4,+sme-i16i64"
+#include <arm_sme.h>
+#include "test_sme2_acle.h"
+
+/*
+** mop4a_1x1_za64_s16_u16_0:
+** ...
+** sumop4a za0\.d, z0\.h, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4a_1x1_za64_s16_u16_0, svint16_t, svuint16_t,
+ svmop4a_1x1_za64_s16_u16 (0, z0, z4),
+ svmop4a_za64 (0, z0, z4));
+
+/*
+** mop4a_1x1_za64_s16_u16_7:
+** ...
+** sumop4a za7\.d, z0\.h, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4a_1x1_za64_s16_u16_7, svint16_t, svuint16_t,
+ svmop4a_1x1_za64_s16_u16 (7, z0, z4),
+ svmop4a_za64 (7, z0, z4));
+
+/*
+** mop4a_1x2_za64_s16_u16_0:
+** ...
+** sumop4a za0\.d, z0\.h, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4a_1x2_za64_s16_u16_0, svint16_t, svuint16x2_t,
+ svmop4a_1x2_za64_s16_u16 (0, z0, z4),
+ svmop4a_za64 (0, z0, z4));
+
+/*
+** mop4a_1x2_za64_s16_u16_7:
+** ...
+** sumop4a za7\.d, z0\.h, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4a_1x2_za64_s16_u16_7, svint16_t, svuint16x2_t,
+ svmop4a_1x2_za64_s16_u16 (7, z0, z4),
+ svmop4a_za64 (7, z0, z4));
+
+/*
+** mop4a_2x1_za64_s16_u16_0:
+** ...
+** sumop4a za0\.d, {z0\.h - z1\.h}, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4a_2x1_za64_s16_u16_0, svint16x2_t, svuint16_t,
+ svmop4a_2x1_za64_s16_u16 (0, z0, z4),
+ svmop4a_za64 (0, z0, z4));
+
+/*
+** mop4a_2x1_za64_s16_u16_7:
+** ...
+** sumop4a za7\.d, {z0\.h - z1\.h}, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4a_2x1_za64_s16_u16_7, svint16x2_t, svuint16_t,
+ svmop4a_2x1_za64_s16_u16 (7, z0, z4),
+ svmop4a_za64 (7, z0, z4));
+
+/*
+** mop4a_2x2_za64_s16_u16_0:
+** ...
+** sumop4a za0\.d, {z0\.h - z1\.h}, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4a_2x2_za64_s16_u16_0, svint16x2_t, svuint16x2_t,
+ svmop4a_2x2_za64_s16_u16 (0, z0, z4),
+ svmop4a_za64 (0, z0, z4));
+
+/*
+** mop4a_2x2_za64_s16_u16_7:
+** ...
+** sumop4a za7\.d, {z0\.h - z1\.h}, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4a_2x2_za64_s16_u16_7, svint16x2_t, svuint16x2_t,
+ svmop4a_2x2_za64_s16_u16 (7, z0, z4),
+ svmop4a_za64 (7, z0, z4));
diff --git
a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za64_u16_s16.c
b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za64_u16_s16.c
new file mode 100644
index 00000000000..20b83ed83dc
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za64_u16_s16.c
@@ -0,0 +1,85 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#pragma GCC target "+sve2,+sme-mop4,+sme-i16i64"
+#include <arm_sme.h>
+#include "test_sme2_acle.h"
+
+/*
+** mop4a_1x1_za64_u16_s16_0:
+** ...
+** usmop4a za0\.d, z0\.h, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4a_1x1_za64_u16_s16_0, svuint16_t, svint16_t,
+ svmop4a_1x1_za64_u16_s16 (0, z0, z4),
+ svmop4a_za64 (0, z0, z4));
+
+/*
+** mop4a_1x1_za64_u16_s16_7:
+** ...
+** usmop4a za7\.d, z0\.h, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4a_1x1_za64_u16_s16_7, svuint16_t, svint16_t,
+ svmop4a_1x1_za64_u16_s16 (7, z0, z4),
+ svmop4a_za64 (7, z0, z4));
+
+/*
+** mop4a_1x2_za64_u16_s16_0:
+** ...
+** usmop4a za0\.d, z0\.h, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4a_1x2_za64_u16_s16_0, svuint16_t, svint16x2_t,
+ svmop4a_1x2_za64_u16_s16 (0, z0, z4),
+ svmop4a_za64 (0, z0, z4));
+
+/*
+** mop4a_1x2_za64_u16_s16_7:
+** ...
+** usmop4a za7\.d, z0\.h, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4a_1x2_za64_u16_s16_7, svuint16_t, svint16x2_t,
+ svmop4a_1x2_za64_u16_s16 (7, z0, z4),
+ svmop4a_za64 (7, z0, z4));
+
+/*
+** mop4a_2x1_za64_u16_s16_0:
+** ...
+** usmop4a za0\.d, {z0\.h - z1\.h}, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4a_2x1_za64_u16_s16_0, svuint16x2_t, svint16_t,
+ svmop4a_2x1_za64_u16_s16 (0, z0, z4),
+ svmop4a_za64 (0, z0, z4));
+
+/*
+** mop4a_2x1_za64_u16_s16_7:
+** ...
+** usmop4a za7\.d, {z0\.h - z1\.h}, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4a_2x1_za64_u16_s16_7, svuint16x2_t, svint16_t,
+ svmop4a_2x1_za64_u16_s16 (7, z0, z4),
+ svmop4a_za64 (7, z0, z4));
+
+/*
+** mop4a_2x2_za64_u16_s16_0:
+** ...
+** usmop4a za0\.d, {z0\.h - z1\.h}, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4a_2x2_za64_u16_s16_0, svuint16x2_t, svint16x2_t,
+ svmop4a_2x2_za64_u16_s16 (0, z0, z4),
+ svmop4a_za64 (0, z0, z4));
+
+/*
+** mop4a_2x2_za64_u16_s16_7:
+** ...
+** usmop4a za7\.d, {z0\.h - z1\.h}, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4a_2x2_za64_u16_s16_7, svuint16x2_t, svint16x2_t,
+ svmop4a_2x2_za64_u16_s16 (7, z0, z4),
+ svmop4a_za64 (7, z0, z4));
diff --git
a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za64_u16_u16.c
b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za64_u16_u16.c
new file mode 100644
index 00000000000..5cee0fade96
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4a_za64_u16_u16.c
@@ -0,0 +1,85 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#pragma GCC target "+sve2,+sme-mop4,+sme-i16i64"
+#include <arm_sme.h>
+#include "test_sme2_acle.h"
+
+/*
+** mop4a_1x1_za64_u16_u16_0:
+** ...
+** umop4a za0\.d, z0\.h, z30\.h
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_1x1_za64_u16_u16_0, svuint16_t,
+ svmop4a_1x1_za64_u16_u16 (0, z0, z1),
+ svmop4a_za64 (0, z0, z1));
+
+/*
+** mop4a_1x1_za64_u16_u16_7:
+** ...
+** umop4a za7\.d, z0\.h, z30\.h
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_1x1_za64_u16_u16_7, svuint16_t,
+ svmop4a_1x1_za64_u16_u16 (7, z0, z1),
+ svmop4a_za64 (7, z0, z1));
+
+/*
+** mop4a_1x2_za64_u16_u16_0:
+** ...
+** umop4a za0\.d, z0\.h, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4a_1x2_za64_u16_u16_0, svuint16_t, svuint16x2_t,
+ svmop4a_1x2_za64_u16_u16 (0, z0, z4),
+ svmop4a_za64 (0, z0, z4));
+
+/*
+** mop4a_1x2_za64_u16_u16_7:
+** ...
+** umop4a za7\.d, z0\.h, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4a_1x2_za64_u16_u16_7, svuint16_t, svuint16x2_t,
+ svmop4a_1x2_za64_u16_u16 (7, z0, z4),
+ svmop4a_za64 (7, z0, z4));
+
+/*
+** mop4a_2x1_za64_u16_u16_0:
+** ...
+** umop4a za0\.d, {z0\.h - z1\.h}, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4a_2x1_za64_u16_u16_0, svuint16x2_t, svuint16_t,
+ svmop4a_2x1_za64_u16_u16 (0, z0, z4),
+ svmop4a_za64 (0, z0, z4));
+
+/*
+** mop4a_2x1_za64_u16_u16_7:
+** ...
+** umop4a za7\.d, {z0\.h - z1\.h}, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4a_2x1_za64_u16_u16_7, svuint16x2_t, svuint16_t,
+ svmop4a_2x1_za64_u16_u16 (7, z0, z4),
+ svmop4a_za64 (7, z0, z4));
+
+/*
+** mop4a_2x2_za64_u16_u16_0:
+** ...
+** umop4a za0\.d, {z0\.h - z1\.h}, {z30\.h - z31\.h}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_2x2_za64_u16_u16_0, svuint16x2_t,
+ svmop4a_2x2_za64_u16_u16 (0, z0, z1),
+ svmop4a_za64 (0, z0, z1));
+
+/*
+** mop4a_2x2_za64_u16_u16_7:
+** ...
+** umop4a za7\.d, {z0\.h - z1\.h}, {z30\.h - z31\.h}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4a_2x2_za64_u16_u16_7, svuint16x2_t,
+ svmop4a_2x2_za64_u16_u16 (7, z0, z1),
+ svmop4a_za64 (7, z0, z1));
diff --git
a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za16_bf16_bf16.c
b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za16_bf16_bf16.c
new file mode 100644
index 00000000000..980b650cc3a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za16_bf16_bf16.c
@@ -0,0 +1,85 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#pragma GCC target "+sve2,+sme-mop4,+sme-b16b16"
+#include <arm_sme.h>
+#include "test_sme2_acle.h"
+
+/*
+** mop4s_1x1_za16_bf16_bf16_0:
+** ...
+** bfmop4s za0\.h, z0\.h, z30\.h
+** ret
+*/
+TEST_UNIFORM_ZA (mop4s_1x1_za16_bf16_bf16_0, svbfloat16_t,
+ svmop4s_1x1_za16_bf16_bf16 (0, z0, z1),
+ svmop4s_za16 (0, z0, z1));
+
+/*
+** mop4s_1x1_za16_bf16_bf16_1:
+** ...
+** bfmop4s za1\.h, z0\.h, z30\.h
+** ret
+*/
+TEST_UNIFORM_ZA (mop4s_1x1_za16_bf16_bf16_1, svbfloat16_t,
+ svmop4s_1x1_za16_bf16_bf16 (1, z0, z1),
+ svmop4s_za16 (1, z0, z1));
+
+/*
+** mop4s_1x2_za16_bf16_bf16_0:
+** ...
+** bfmop4s za0\.h, z0\.h, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4s_1x2_za16_bf16_bf16_0, svbfloat16_t, svbfloat16x2_t,
+ svmop4s_1x2_za16_bf16_bf16 (0, z0, z4),
+ svmop4s_za16 (0, z0, z4));
+
+/*
+** mop4s_1x2_za16_bf16_bf16_1:
+** ...
+** bfmop4s za1\.h, z0\.h, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4s_1x2_za16_bf16_bf16_1, svbfloat16_t, svbfloat16x2_t,
+ svmop4s_1x2_za16_bf16_bf16 (1, z0, z4),
+ svmop4s_za16 (1, z0, z4));
+
+/*
+** mop4s_2x1_za16_bf16_bf16_0:
+** ...
+** bfmop4s za0\.h, {z0\.h - z1\.h}, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4s_2x1_za16_bf16_bf16_0, svbfloat16x2_t, svbfloat16_t,
+ svmop4s_2x1_za16_bf16_bf16 (0, z0, z4),
+ svmop4s_za16 (0, z0, z4));
+
+/*
+** mop4s_2x1_za16_bf16_bf16_1:
+** ...
+** bfmop4s za1\.h, {z0\.h - z1\.h}, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4s_2x1_za16_bf16_bf16_1, svbfloat16x2_t, svbfloat16_t,
+ svmop4s_2x1_za16_bf16_bf16 (1, z0, z4),
+ svmop4s_za16 (1, z0, z4));
+
+/*
+** mop4s_2x2_za16_bf16_bf16_0:
+** ...
+** bfmop4s za0\.h, {z0\.h - z1\.h}, {z30\.h - z31\.h}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4s_2x2_za16_bf16_bf16_0, svbfloat16x2_t,
+ svmop4s_2x2_za16_bf16_bf16 (0, z0, z1),
+ svmop4s_za16 (0, z0, z1));
+
+/*
+** mop4s_2x2_za16_bf16_bf16_1:
+** ...
+** bfmop4s za1\.h, {z0\.h - z1\.h}, {z30\.h - z31\.h}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4s_2x2_za16_bf16_bf16_1, svbfloat16x2_t,
+ svmop4s_2x2_za16_bf16_bf16 (1, z0, z1),
+ svmop4s_za16 (1, z0, z1));
diff --git
a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za16_f16_f16.c
b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za16_f16_f16.c
new file mode 100644
index 00000000000..234f3898066
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za16_f16_f16.c
@@ -0,0 +1,85 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#pragma GCC target "+sve2,+sme-mop4,+sme-f16f16"
+#include <arm_sme.h>
+#include "test_sme2_acle.h"
+
+/*
+** mop4s_1x1_za16_f16_f16_0:
+** ...
+** fmop4s za0\.h, z0\.h, z30\.h
+** ret
+*/
+TEST_UNIFORM_ZA (mop4s_1x1_za16_f16_f16_0, svfloat16_t,
+ svmop4s_1x1_za16_f16_f16 (0, z0, z1),
+ svmop4s_za16 (0, z0, z1));
+
+/*
+** mop4s_1x1_za16_f16_f16_1:
+** ...
+** fmop4s za1\.h, z0\.h, z30\.h
+** ret
+*/
+TEST_UNIFORM_ZA (mop4s_1x1_za16_f16_f16_1, svfloat16_t,
+ svmop4s_1x1_za16_f16_f16 (1, z0, z1),
+ svmop4s_za16 (1, z0, z1));
+
+/*
+** mop4s_1x2_za16_f16_f16_0:
+** ...
+** fmop4s za0\.h, z0\.h, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4s_1x2_za16_f16_f16_0, svfloat16_t, svfloat16x2_t,
+ svmop4s_1x2_za16_f16_f16 (0, z0, z4),
+ svmop4s_za16 (0, z0, z4));
+
+/*
+** mop4s_1x2_za16_f16_f16_1:
+** ...
+** fmop4s za1\.h, z0\.h, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4s_1x2_za16_f16_f16_1, svfloat16_t, svfloat16x2_t,
+ svmop4s_1x2_za16_f16_f16 (1, z0, z4),
+ svmop4s_za16 (1, z0, z4));
+
+/*
+** mop4s_2x1_za16_f16_f16_0:
+** ...
+** fmop4s za0\.h, {z0\.h - z1\.h}, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4s_2x1_za16_f16_f16_0, svfloat16x2_t, svfloat16_t,
+ svmop4s_2x1_za16_f16_f16 (0, z0, z4),
+ svmop4s_za16 (0, z0, z4));
+
+/*
+** mop4s_2x1_za16_f16_f16_1:
+** ...
+** fmop4s za1\.h, {z0\.h - z1\.h}, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4s_2x1_za16_f16_f16_1, svfloat16x2_t, svfloat16_t,
+ svmop4s_2x1_za16_f16_f16 (1, z0, z4),
+ svmop4s_za16 (1, z0, z4));
+
+/*
+** mop4s_2x2_za16_f16_f16_0:
+** ...
+** fmop4s za0\.h, {z0\.h - z1\.h}, {z30\.h - z31\.h}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4s_2x2_za16_f16_f16_0, svfloat16x2_t,
+ svmop4s_2x2_za16_f16_f16 (0, z0, z1),
+ svmop4s_za16 (0, z0, z1));
+
+/*
+** mop4s_2x2_za16_f16_f16_1:
+** ...
+** fmop4s za1\.h, {z0\.h - z1\.h}, {z30\.h - z31\.h}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4s_2x2_za16_f16_f16_1, svfloat16x2_t,
+ svmop4s_2x2_za16_f16_f16 (1, z0, z1),
+ svmop4s_za16 (1, z0, z1));
diff --git
a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za32_bf16_bf16.c
b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za32_bf16_bf16.c
new file mode 100644
index 00000000000..346033a8ec2
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za32_bf16_bf16.c
@@ -0,0 +1,85 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#pragma GCC target "+sve2,+sme-mop4,+sme-b16b16"
+#include <arm_sme.h>
+#include "test_sme2_acle.h"
+
+/*
+** mop4s_1x1_za32_bf16_bf16_0:
+** ...
+** bfmop4s za0\.s, z0\.h, z30\.h
+** ret
+*/
+TEST_UNIFORM_ZA (mop4s_1x1_za32_bf16_bf16_0, svbfloat16_t,
+ svmop4s_1x1_za32_bf16_bf16 (0, z0, z1),
+ svmop4s_za32 (0, z0, z1));
+
+/*
+** mop4s_1x1_za32_bf16_bf16_3:
+** ...
+** bfmop4s za3\.s, z0\.h, z30\.h
+** ret
+*/
+TEST_UNIFORM_ZA (mop4s_1x1_za32_bf16_bf16_3, svbfloat16_t,
+ svmop4s_1x1_za32_bf16_bf16 (3, z0, z1),
+ svmop4s_za32 (3, z0, z1));
+
+/*
+** mop4s_1x2_za32_bf16_bf16_0:
+** ...
+** bfmop4s za0\.s, z0\.h, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4s_1x2_za32_bf16_bf16_0, svbfloat16_t, svbfloat16x2_t,
+ svmop4s_1x2_za32_bf16_bf16 (0, z0, z4),
+ svmop4s_za32 (0, z0, z4));
+
+/*
+** mop4s_1x2_za32_bf16_bf16_3:
+** ...
+** bfmop4s za3\.s, z0\.h, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4s_1x2_za32_bf16_bf16_3, svbfloat16_t, svbfloat16x2_t,
+ svmop4s_1x2_za32_bf16_bf16 (3, z0, z4),
+ svmop4s_za32 (3, z0, z4));
+
+/*
+** mop4s_2x1_za32_bf16_bf16_0:
+** ...
+** bfmop4s za0\.s, {z0\.h - z1\.h}, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4s_2x1_za32_bf16_bf16_0, svbfloat16x2_t, svbfloat16_t,
+ svmop4s_2x1_za32_bf16_bf16 (0, z0, z4),
+ svmop4s_za32 (0, z0, z4));
+
+/*
+** mop4s_2x1_za32_bf16_bf16_3:
+** ...
+** bfmop4s za3\.s, {z0\.h - z1\.h}, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4s_2x1_za32_bf16_bf16_3, svbfloat16x2_t, svbfloat16_t,
+ svmop4s_2x1_za32_bf16_bf16 (3, z0, z4),
+ svmop4s_za32 (3, z0, z4));
+
+/*
+** mop4s_2x2_za32_bf16_bf16_0:
+** ...
+** bfmop4s za0\.s, {z0\.h - z1\.h}, {z30\.h - z31\.h}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4s_2x2_za32_bf16_bf16_0, svbfloat16x2_t,
+ svmop4s_2x2_za32_bf16_bf16 (0, z0, z1),
+ svmop4s_za32 (0, z0, z1));
+
+/*
+** mop4s_2x2_za32_bf16_bf16_3:
+** ...
+** bfmop4s za3\.s, {z0\.h - z1\.h}, {z30\.h - z31\.h}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4s_2x2_za32_bf16_bf16_3, svbfloat16x2_t,
+ svmop4s_2x2_za32_bf16_bf16 (3, z0, z1),
+ svmop4s_za32 (3, z0, z1));
diff --git
a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za32_f16_f16.c
b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za32_f16_f16.c
new file mode 100644
index 00000000000..aa8178b3d0f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za32_f16_f16.c
@@ -0,0 +1,85 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#pragma GCC target "+sve2,+sme-mop4,+sme-f16f16"
+#include <arm_sme.h>
+#include "test_sme2_acle.h"
+
+/*
+** mop4s_1x1_za32_f16_f16_0:
+** ...
+** fmop4s za0\.s, z0\.h, z30\.h
+** ret
+*/
+TEST_UNIFORM_ZA (mop4s_1x1_za32_f16_f16_0, svfloat16_t,
+ svmop4s_1x1_za32_f16_f16 (0, z0, z1),
+ svmop4s_za32 (0, z0, z1));
+
+/*
+** mop4s_1x1_za32_f16_f16_3:
+** ...
+** fmop4s za3\.s, z0\.h, z30\.h
+** ret
+*/
+TEST_UNIFORM_ZA (mop4s_1x1_za32_f16_f16_3, svfloat16_t,
+ svmop4s_1x1_za32_f16_f16 (3, z0, z1),
+ svmop4s_za32 (3, z0, z1));
+
+/*
+** mop4s_1x2_za32_f16_f16_0:
+** ...
+** fmop4s za0\.s, z0\.h, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4s_1x2_za32_f16_f16_0, svfloat16_t, svfloat16x2_t,
+ svmop4s_1x2_za32_f16_f16 (0, z0, z4),
+ svmop4s_za32 (0, z0, z4));
+
+/*
+** mop4s_1x2_za32_f16_f16_3:
+** ...
+** fmop4s za3\.s, z0\.h, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4s_1x2_za32_f16_f16_3, svfloat16_t, svfloat16x2_t,
+ svmop4s_1x2_za32_f16_f16 (3, z0, z4),
+ svmop4s_za32 (3, z0, z4));
+
+/*
+** mop4s_2x1_za32_f16_f16_0:
+** ...
+** fmop4s za0\.s, {z0\.h - z1\.h}, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4s_2x1_za32_f16_f16_0, svfloat16x2_t, svfloat16_t,
+ svmop4s_2x1_za32_f16_f16 (0, z0, z4),
+ svmop4s_za32 (0, z0, z4));
+
+/*
+** mop4s_2x1_za32_f16_f16_3:
+** ...
+** fmop4s za3\.s, {z0\.h - z1\.h}, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4s_2x1_za32_f16_f16_3, svfloat16x2_t, svfloat16_t,
+ svmop4s_2x1_za32_f16_f16 (3, z0, z4),
+ svmop4s_za32 (3, z0, z4));
+
+/*
+** mop4s_2x2_za32_f16_f16_0:
+** ...
+** fmop4s za0\.s, {z0\.h - z1\.h}, {z30\.h - z31\.h}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4s_2x2_za32_f16_f16_0, svfloat16x2_t,
+ svmop4s_2x2_za32_f16_f16 (0, z0, z1),
+ svmop4s_za32 (0, z0, z1));
+
+/*
+** mop4s_2x2_za32_f16_f16_3:
+** ...
+** fmop4s za3\.s, {z0\.h - z1\.h}, {z30\.h - z31\.h}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4s_2x2_za32_f16_f16_3, svfloat16x2_t,
+ svmop4s_2x2_za32_f16_f16 (3, z0, z1),
+ svmop4s_za32 (3, z0, z1));
diff --git
a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za32_s16_s16.c
b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za32_s16_s16.c
new file mode 100644
index 00000000000..ee72059d739
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za32_s16_s16.c
@@ -0,0 +1,85 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#pragma GCC target "+sve2,+sme-mop4"
+#include <arm_sme.h>
+#include "test_sme2_acle.h"
+
+/*
+** mop4s_1x1_za32_s16_s16_0:
+** ...
+** smop4s za0\.s, z0\.h, z30\.h
+** ret
+*/
+TEST_UNIFORM_ZA (mop4s_1x1_za32_s16_s16_0, svint16_t,
+ svmop4s_1x1_za32_s16_s16 (0, z0, z1),
+ svmop4s_za32 (0, z0, z1));
+
+/*
+** mop4s_1x1_za32_s16_s16_3:
+** ...
+** smop4s za3\.s, z0\.h, z30\.h
+** ret
+*/
+TEST_UNIFORM_ZA (mop4s_1x1_za32_s16_s16_3, svint16_t,
+ svmop4s_1x1_za32_s16_s16 (3, z0, z1),
+ svmop4s_za32 (3, z0, z1));
+
+/*
+** mop4s_1x2_za32_s16_s16_0:
+** ...
+** smop4s za0\.s, z0\.h, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4s_1x2_za32_s16_s16_0, svint16_t, svint16x2_t,
+ svmop4s_1x2_za32_s16_s16 (0, z0, z4),
+ svmop4s_za32 (0, z0, z4));
+
+/*
+** mop4s_1x2_za32_s16_s16_3:
+** ...
+** smop4s za3\.s, z0\.h, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4s_1x2_za32_s16_s16_3, svint16_t, svint16x2_t,
+ svmop4s_1x2_za32_s16_s16 (3, z0, z4),
+ svmop4s_za32 (3, z0, z4));
+
+/*
+** mop4s_2x1_za32_s16_s16_0:
+** ...
+** smop4s za0\.s, {z0\.h - z1\.h}, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4s_2x1_za32_s16_s16_0, svint16x2_t, svint16_t,
+ svmop4s_2x1_za32_s16_s16 (0, z0, z4),
+ svmop4s_za32 (0, z0, z4));
+
+/*
+** mop4s_2x1_za32_s16_s16_3:
+** ...
+** smop4s za3\.s, {z0\.h - z1\.h}, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4s_2x1_za32_s16_s16_3, svint16x2_t, svint16_t,
+ svmop4s_2x1_za32_s16_s16 (3, z0, z4),
+ svmop4s_za32 (3, z0, z4));
+
+/*
+** mop4s_2x2_za32_s16_s16_0:
+** ...
+** smop4s za0\.s, {z0\.h - z1\.h}, {z30\.h - z31\.h}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4s_2x2_za32_s16_s16_0, svint16x2_t,
+ svmop4s_2x2_za32_s16_s16 (0, z0, z1),
+ svmop4s_za32 (0, z0, z1));
+
+/*
+** mop4s_2x2_za32_s16_s16_3:
+** ...
+** smop4s za3\.s, {z0\.h - z1\.h}, {z30\.h - z31\.h}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4s_2x2_za32_s16_s16_3, svint16x2_t,
+ svmop4s_2x2_za32_s16_s16 (3, z0, z1),
+ svmop4s_za32 (3, z0, z1));
diff --git a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za32_s8_s8.c
b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za32_s8_s8.c
new file mode 100644
index 00000000000..423b127fcbd
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za32_s8_s8.c
@@ -0,0 +1,85 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#pragma GCC target "+sve2,+sme-mop4"
+#include <arm_sme.h>
+#include "test_sme2_acle.h"
+
+/*
+** mop4s_1x1_za32_s8_s8_0:
+** ...
+** smop4s za0\.s, z0\.b, z30\.b
+** ret
+*/
+TEST_UNIFORM_ZA (mop4s_1x1_za32_s8_s8_0, svint8_t,
+ svmop4s_1x1_za32_s8_s8 (0, z0, z1),
+ svmop4s_za32 (0, z0, z1));
+
+/*
+** mop4s_1x1_za32_s8_s8_3:
+** ...
+** smop4s za3\.s, z0\.b, z30\.b
+** ret
+*/
+TEST_UNIFORM_ZA (mop4s_1x1_za32_s8_s8_3, svint8_t,
+ svmop4s_1x1_za32_s8_s8 (3, z0, z1),
+ svmop4s_za32 (3, z0, z1));
+
+/*
+** mop4s_1x2_za32_s8_s8_0:
+** ...
+** smop4s za0\.s, z0\.b, {z30\.b - z31\.b}
+** ret
+*/
+TEST_DUAL_ZA (mop4s_1x2_za32_s8_s8_0, svint8_t, svint8x2_t,
+ svmop4s_1x2_za32_s8_s8 (0, z0, z4),
+ svmop4s_za32 (0, z0, z4));
+
+/*
+** mop4s_1x2_za32_s8_s8_3:
+** ...
+** smop4s za3\.s, z0\.b, {z30\.b - z31\.b}
+** ret
+*/
+TEST_DUAL_ZA (mop4s_1x2_za32_s8_s8_3, svint8_t, svint8x2_t,
+ svmop4s_1x2_za32_s8_s8 (3, z0, z4),
+ svmop4s_za32 (3, z0, z4));
+
+/*
+** mop4s_2x1_za32_s8_s8_0:
+** ...
+** smop4s za0\.s, {z0\.b - z1\.b}, z30\.b
+** ret
+*/
+TEST_DUAL_ZA (mop4s_2x1_za32_s8_s8_0, svint8x2_t, svint8_t,
+ svmop4s_2x1_za32_s8_s8 (0, z0, z4),
+ svmop4s_za32 (0, z0, z4));
+
+/*
+** mop4s_2x1_za32_s8_s8_3:
+** ...
+** smop4s za3\.s, {z0\.b - z1\.b}, z30\.b
+** ret
+*/
+TEST_DUAL_ZA (mop4s_2x1_za32_s8_s8_3, svint8x2_t, svint8_t,
+ svmop4s_2x1_za32_s8_s8 (3, z0, z4),
+ svmop4s_za32 (3, z0, z4));
+
+/*
+** mop4s_2x2_za32_s8_s8_0:
+** ...
+** smop4s za0\.s, {z0\.b - z1\.b}, {z30\.b - z31\.b}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4s_2x2_za32_s8_s8_0, svint8x2_t,
+ svmop4s_2x2_za32_s8_s8 (0, z0, z1),
+ svmop4s_za32 (0, z0, z1));
+
+/*
+** mop4s_2x2_za32_s8_s8_3:
+** ...
+** smop4s za3\.s, {z0\.b - z1\.b}, {z30\.b - z31\.b}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4s_2x2_za32_s8_s8_3, svint8x2_t,
+ svmop4s_2x2_za32_s8_s8 (3, z0, z1),
+ svmop4s_za32 (3, z0, z1));
diff --git a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za32_s8_u8.c
b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za32_s8_u8.c
new file mode 100644
index 00000000000..b82dc21df8e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za32_s8_u8.c
@@ -0,0 +1,85 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#pragma GCC target "+sve2,+sme-mop4"
+#include <arm_sme.h>
+#include "test_sme2_acle.h"
+
+/*
+** mop4s_1x1_za32_s8_u8_0:
+** ...
+** sumop4s za0\.s, z0\.b, z30\.b
+** ret
+*/
+TEST_DUAL_ZA (mop4s_1x1_za32_s8_u8_0, svint8_t, svuint8_t,
+ svmop4s_1x1_za32_s8_u8 (0, z0, z4),
+ svmop4s_za32 (0, z0, z4));
+
+/*
+** mop4s_1x1_za32_s8_u8_3:
+** ...
+** sumop4s za3\.s, z0\.b, z30\.b
+** ret
+*/
+TEST_DUAL_ZA (mop4s_1x1_za32_s8_u8_3, svint8_t, svuint8_t,
+ svmop4s_1x1_za32_s8_u8 (3, z0, z4),
+ svmop4s_za32 (3, z0, z4));
+
+/*
+** mop4s_1x2_za32_s8_u8_0:
+** ...
+** sumop4s za0\.s, z0\.b, {z30\.b - z31\.b}
+** ret
+*/
+TEST_DUAL_ZA (mop4s_1x2_za32_s8_u8_0, svint8_t, svuint8x2_t,
+ svmop4s_1x2_za32_s8_u8 (0, z0, z4),
+ svmop4s_za32 (0, z0, z4));
+
+/*
+** mop4s_1x2_za32_s8_u8_3:
+** ...
+** sumop4s za3\.s, z0\.b, {z30\.b - z31\.b}
+** ret
+*/
+TEST_DUAL_ZA (mop4s_1x2_za32_s8_u8_3, svint8_t, svuint8x2_t,
+ svmop4s_1x2_za32_s8_u8 (3, z0, z4),
+ svmop4s_za32 (3, z0, z4));
+
+/*
+** mop4s_2x1_za32_s8_u8_0:
+** ...
+** sumop4s za0\.s, {z0\.b - z1\.b}, z30\.b
+** ret
+*/
+TEST_DUAL_ZA (mop4s_2x1_za32_s8_u8_0, svint8x2_t, svuint8_t,
+ svmop4s_2x1_za32_s8_u8 (0, z0, z4),
+ svmop4s_za32 (0, z0, z4));
+
+/*
+** mop4s_2x1_za32_s8_u8_3:
+** ...
+** sumop4s za3\.s, {z0\.b - z1\.b}, z30\.b
+** ret
+*/
+TEST_DUAL_ZA (mop4s_2x1_za32_s8_u8_3, svint8x2_t, svuint8_t,
+ svmop4s_2x1_za32_s8_u8 (3, z0, z4),
+ svmop4s_za32 (3, z0, z4));
+
+/*
+** mop4s_2x2_za32_s8_u8_0:
+** ...
+** sumop4s za0\.s, {z0\.b - z1\.b}, {z30\.b - z31\.b}
+** ret
+*/
+TEST_DUAL_ZA (mop4s_2x2_za32_s8_u8_0, svint8x2_t, svuint8x2_t,
+ svmop4s_2x2_za32_s8_u8 (0, z0, z4),
+ svmop4s_za32 (0, z0, z4));
+
+/*
+** mop4s_2x2_za32_s8_u8_3:
+** ...
+** sumop4s za3\.s, {z0\.b - z1\.b}, {z30\.b - z31\.b}
+** ret
+*/
+TEST_DUAL_ZA (mop4s_2x2_za32_s8_u8_3, svint8x2_t, svuint8x2_t,
+ svmop4s_2x2_za32_s8_u8 (3, z0, z4),
+ svmop4s_za32 (3, z0, z4));
diff --git
a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za32_u16_u16.c
b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za32_u16_u16.c
new file mode 100644
index 00000000000..8d7a211c54f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za32_u16_u16.c
@@ -0,0 +1,85 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#pragma GCC target "+sve2,+sme-mop4"
+#include <arm_sme.h>
+#include "test_sme2_acle.h"
+
+/*
+** mop4s_1x1_za32_u16_u16_0:
+** ...
+** umop4s za0\.s, z0\.h, z30\.h
+** ret
+*/
+TEST_UNIFORM_ZA (mop4s_1x1_za32_u16_u16_0, svuint16_t,
+ svmop4s_1x1_za32_u16_u16 (0, z0, z1),
+ svmop4s_za32 (0, z0, z1));
+
+/*
+** mop4s_1x1_za32_u16_u16_3:
+** ...
+** umop4s za3\.s, z0\.h, z30\.h
+** ret
+*/
+TEST_UNIFORM_ZA (mop4s_1x1_za32_u16_u16_3, svuint16_t,
+ svmop4s_1x1_za32_u16_u16 (3, z0, z1),
+ svmop4s_za32 (3, z0, z1));
+
+/*
+** mop4s_1x2_za32_u16_u16_0:
+** ...
+** umop4s za0\.s, z0\.h, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4s_1x2_za32_u16_u16_0, svuint16_t, svuint16x2_t,
+ svmop4s_1x2_za32_u16_u16 (0, z0, z4),
+ svmop4s_za32 (0, z0, z4));
+
+/*
+** mop4s_1x2_za32_u16_u16_3:
+** ...
+** umop4s za3\.s, z0\.h, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4s_1x2_za32_u16_u16_3, svuint16_t, svuint16x2_t,
+ svmop4s_1x2_za32_u16_u16 (3, z0, z4),
+ svmop4s_za32 (3, z0, z4));
+
+/*
+** mop4s_2x1_za32_u16_u16_0:
+** ...
+** umop4s za0\.s, {z0\.h - z1\.h}, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4s_2x1_za32_u16_u16_0, svuint16x2_t, svuint16_t,
+ svmop4s_2x1_za32_u16_u16 (0, z0, z4),
+ svmop4s_za32 (0, z0, z4));
+
+/*
+** mop4s_2x1_za32_u16_u16_3:
+** ...
+** umop4s za3\.s, {z0\.h - z1\.h}, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4s_2x1_za32_u16_u16_3, svuint16x2_t, svuint16_t,
+ svmop4s_2x1_za32_u16_u16 (3, z0, z4),
+ svmop4s_za32 (3, z0, z4));
+
+/*
+** mop4s_2x2_za32_u16_u16_0:
+** ...
+** umop4s za0\.s, {z0\.h - z1\.h}, {z30\.h - z31\.h}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4s_2x2_za32_u16_u16_0, svuint16x2_t,
+ svmop4s_2x2_za32_u16_u16 (0, z0, z1),
+ svmop4s_za32 (0, z0, z1));
+
+/*
+** mop4s_2x2_za32_u16_u16_3:
+** ...
+** umop4s za3\.s, {z0\.h - z1\.h}, {z30\.h - z31\.h}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4s_2x2_za32_u16_u16_3, svuint16x2_t,
+ svmop4s_2x2_za32_u16_u16 (3, z0, z1),
+ svmop4s_za32 (3, z0, z1));
diff --git a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za32_u8_s8.c
b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za32_u8_s8.c
new file mode 100644
index 00000000000..cd18b3f773d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za32_u8_s8.c
@@ -0,0 +1,85 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#pragma GCC target "+sve2,+sme-mop4"
+#include <arm_sme.h>
+#include "test_sme2_acle.h"
+
+/*
+** mop4s_1x1_za32_u8_s8_0:
+** ...
+** usmop4s za0\.s, z0\.b, z30\.b
+** ret
+*/
+TEST_DUAL_ZA (mop4s_1x1_za32_u8_s8_0, svuint8_t, svint8_t,
+ svmop4s_1x1_za32_u8_s8 (0, z0, z4),
+ svmop4s_za32 (0, z0, z4));
+
+/*
+** mop4s_1x1_za32_u8_s8_3:
+** ...
+** usmop4s za3\.s, z0\.b, z30\.b
+** ret
+*/
+TEST_DUAL_ZA (mop4s_1x1_za32_u8_s8_3, svuint8_t, svint8_t,
+ svmop4s_1x1_za32_u8_s8 (3, z0, z4),
+ svmop4s_za32 (3, z0, z4));
+
+/*
+** mop4s_1x2_za32_u8_s8_0:
+** ...
+** usmop4s za0\.s, z0\.b, {z30\.b - z31\.b}
+** ret
+*/
+TEST_DUAL_ZA (mop4s_1x2_za32_u8_s8_0, svuint8_t, svint8x2_t,
+ svmop4s_1x2_za32_u8_s8 (0, z0, z4),
+ svmop4s_za32 (0, z0, z4));
+
+/*
+** mop4s_1x2_za32_u8_s8_3:
+** ...
+** usmop4s za3\.s, z0\.b, {z30\.b - z31\.b}
+** ret
+*/
+TEST_DUAL_ZA (mop4s_1x2_za32_u8_s8_3, svuint8_t, svint8x2_t,
+ svmop4s_1x2_za32_u8_s8 (3, z0, z4),
+ svmop4s_za32 (3, z0, z4));
+
+/*
+** mop4s_2x1_za32_u8_s8_0:
+** ...
+** usmop4s za0\.s, {z0\.b - z1\.b}, z30\.b
+** ret
+*/
+TEST_DUAL_ZA (mop4s_2x1_za32_u8_s8_0, svuint8x2_t, svint8_t,
+ svmop4s_2x1_za32_u8_s8 (0, z0, z4),
+ svmop4s_za32 (0, z0, z4));
+
+/*
+** mop4s_2x1_za32_u8_s8_3:
+** ...
+** usmop4s za3\.s, {z0\.b - z1\.b}, z30\.b
+** ret
+*/
+TEST_DUAL_ZA (mop4s_2x1_za32_u8_s8_3, svuint8x2_t, svint8_t,
+ svmop4s_2x1_za32_u8_s8 (3, z0, z4),
+ svmop4s_za32 (3, z0, z4));
+
+/*
+** mop4s_2x2_za32_u8_s8_0:
+** ...
+** usmop4s za0\.s, {z0\.b - z1\.b}, {z30\.b - z31\.b}
+** ret
+*/
+TEST_DUAL_ZA (mop4s_2x2_za32_u8_s8_0, svuint8x2_t, svint8x2_t,
+ svmop4s_2x2_za32_u8_s8 (0, z0, z4),
+ svmop4s_za32 (0, z0, z4));
+
+/*
+** mop4s_2x2_za32_u8_s8_3:
+** ...
+** usmop4s za3\.s, {z0\.b - z1\.b}, {z30\.b - z31\.b}
+** ret
+*/
+TEST_DUAL_ZA (mop4s_2x2_za32_u8_s8_3, svuint8x2_t, svint8x2_t,
+ svmop4s_2x2_za32_u8_s8 (3, z0, z4),
+ svmop4s_za32 (3, z0, z4));
diff --git a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za32_u8_u8.c
b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za32_u8_u8.c
new file mode 100644
index 00000000000..4f0b5f9faa8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za32_u8_u8.c
@@ -0,0 +1,85 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#pragma GCC target "+sve2,+sme-mop4"
+#include <arm_sme.h>
+#include "test_sme2_acle.h"
+
+/*
+** mop4s_1x1_za32_u8_u8_0:
+** ...
+** umop4s za0\.s, z0\.b, z30\.b
+** ret
+*/
+TEST_UNIFORM_ZA (mop4s_1x1_za32_u8_u8_0, svuint8_t,
+ svmop4s_1x1_za32_u8_u8 (0, z0, z1),
+ svmop4s_za32 (0, z0, z1));
+
+/*
+** mop4s_1x1_za32_u8_u8_3:
+** ...
+** umop4s za3\.s, z0\.b, z30\.b
+** ret
+*/
+TEST_UNIFORM_ZA (mop4s_1x1_za32_u8_u8_3, svuint8_t,
+ svmop4s_1x1_za32_u8_u8 (3, z0, z1),
+ svmop4s_za32 (3, z0, z1));
+
+/*
+** mop4s_1x2_za32_u8_u8_0:
+** ...
+** umop4s za0\.s, z0\.b, {z30\.b - z31\.b}
+** ret
+*/
+TEST_DUAL_ZA (mop4s_1x2_za32_u8_u8_0, svuint8_t, svuint8x2_t,
+ svmop4s_1x2_za32_u8_u8 (0, z0, z4),
+ svmop4s_za32 (0, z0, z4));
+
+/*
+** mop4s_1x2_za32_u8_u8_3:
+** ...
+** umop4s za3\.s, z0\.b, {z30\.b - z31\.b}
+** ret
+*/
+TEST_DUAL_ZA (mop4s_1x2_za32_u8_u8_3, svuint8_t, svuint8x2_t,
+ svmop4s_1x2_za32_u8_u8 (3, z0, z4),
+ svmop4s_za32 (3, z0, z4));
+
+/*
+** mop4s_2x1_za32_u8_u8_0:
+** ...
+** umop4s za0\.s, {z0\.b - z1\.b}, z30\.b
+** ret
+*/
+TEST_DUAL_ZA (mop4s_2x1_za32_u8_u8_0, svuint8x2_t, svuint8_t,
+ svmop4s_2x1_za32_u8_u8 (0, z0, z4),
+ svmop4s_za32 (0, z0, z4));
+
+/*
+** mop4s_2x1_za32_u8_u8_3:
+** ...
+** umop4s za3\.s, {z0\.b - z1\.b}, z30\.b
+** ret
+*/
+TEST_DUAL_ZA (mop4s_2x1_za32_u8_u8_3, svuint8x2_t, svuint8_t,
+ svmop4s_2x1_za32_u8_u8 (3, z0, z4),
+ svmop4s_za32 (3, z0, z4));
+
+/*
+** mop4s_2x2_za32_u8_u8_0:
+** ...
+** umop4s za0\.s, {z0\.b - z1\.b}, {z30\.b - z31\.b}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4s_2x2_za32_u8_u8_0, svuint8x2_t,
+ svmop4s_2x2_za32_u8_u8 (0, z0, z1),
+ svmop4s_za32 (0, z0, z1));
+
+/*
+** mop4s_2x2_za32_u8_u8_3:
+** ...
+** umop4s za3\.s, {z0\.b - z1\.b}, {z30\.b - z31\.b}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4s_2x2_za32_u8_u8_3, svuint8x2_t,
+ svmop4s_2x2_za32_u8_u8 (3, z0, z1),
+ svmop4s_za32 (3, z0, z1));
diff --git
a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za64_f64_f64.c
b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za64_f64_f64.c
new file mode 100644
index 00000000000..4dc30b60e80
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za64_f64_f64.c
@@ -0,0 +1,85 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#pragma GCC target "+sve2,+sme-mop4,+sme-f64f64"
+#include <arm_sme.h>
+#include "test_sme2_acle.h"
+
+/*
+** mop4s_1x1_za64_f64_f64_0:
+** ...
+** fmop4s za0\.d, z0\.d, z30\.d
+** ret
+*/
+TEST_UNIFORM_ZA (mop4s_1x1_za64_f64_f64_0, svfloat64_t,
+ svmop4s_1x1_za64_f64_f64 (0, z0, z1),
+ svmop4s_za64 (0, z0, z1));
+
+/*
+** mop4s_1x1_za64_f64_f64_7:
+** ...
+** fmop4s za7\.d, z0\.d, z30\.d
+** ret
+*/
+TEST_UNIFORM_ZA (mop4s_1x1_za64_f64_f64_7, svfloat64_t,
+ svmop4s_1x1_za64_f64_f64 (7, z0, z1),
+ svmop4s_za64 (7, z0, z1));
+
+/*
+** mop4s_1x2_za64_f64_f64_0:
+** ...
+** fmop4s za0\.d, z0\.d, {z30\.d - z31\.d}
+** ret
+*/
+TEST_DUAL_ZA (mop4s_1x2_za64_f64_f64_0, svfloat64_t, svfloat64x2_t,
+ svmop4s_1x2_za64_f64_f64 (0, z0, z4),
+ svmop4s_za64 (0, z0, z4));
+
+/*
+** mop4s_1x2_za64_f64_f64_7:
+** ...
+** fmop4s za7\.d, z0\.d, {z30\.d - z31\.d}
+** ret
+*/
+TEST_DUAL_ZA (mop4s_1x2_za64_f64_f64_7, svfloat64_t, svfloat64x2_t,
+ svmop4s_1x2_za64_f64_f64 (7, z0, z4),
+ svmop4s_za64 (7, z0, z4));
+
+/*
+** mop4s_2x1_za64_f64_f64_0:
+** ...
+** fmop4s za0\.d, {z0\.d - z1\.d}, z30\.d
+** ret
+*/
+TEST_DUAL_ZA (mop4s_2x1_za64_f64_f64_0, svfloat64x2_t, svfloat64_t,
+ svmop4s_2x1_za64_f64_f64 (0, z0, z4),
+ svmop4s_za64 (0, z0, z4));
+
+/*
+** mop4s_2x1_za64_f64_f64_7:
+** ...
+** fmop4s za7\.d, {z0\.d - z1\.d}, z30\.d
+** ret
+*/
+TEST_DUAL_ZA (mop4s_2x1_za64_f64_f64_7, svfloat64x2_t, svfloat64_t,
+ svmop4s_2x1_za64_f64_f64 (7, z0, z4),
+ svmop4s_za64 (7, z0, z4));
+
+/*
+** mop4s_2x2_za64_f64_f64_0:
+** ...
+** fmop4s za0\.d, {z0\.d - z1\.d}, {z30\.d - z31\.d}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4s_2x2_za64_f64_f64_0, svfloat64x2_t,
+ svmop4s_2x2_za64_f64_f64 (0, z0, z1),
+ svmop4s_za64 (0, z0, z1));
+
+/*
+** mop4s_2x2_za64_f64_f64_7:
+** ...
+** fmop4s za7\.d, {z0\.d - z1\.d}, {z30\.d - z31\.d}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4s_2x2_za64_f64_f64_7, svfloat64x2_t,
+ svmop4s_2x2_za64_f64_f64 (7, z0, z1),
+ svmop4s_za64 (7, z0, z1));
diff --git
a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za64_s16_s16.c
b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za64_s16_s16.c
new file mode 100644
index 00000000000..c29b6a0172d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za64_s16_s16.c
@@ -0,0 +1,85 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#pragma GCC target "+sve2,+sme-mop4,+sme-i16i64"
+#include <arm_sme.h>
+#include "test_sme2_acle.h"
+
+/*
+** mop4s_1x1_za64_s16_s16_0:
+** ...
+** smop4s za0\.d, z0\.h, z30\.h
+** ret
+*/
+TEST_UNIFORM_ZA (mop4s_1x1_za64_s16_s16_0, svint16_t,
+ svmop4s_1x1_za64_s16_s16 (0, z0, z1),
+ svmop4s_za64 (0, z0, z1));
+
+/*
+** mop4s_1x1_za64_s16_s16_7:
+** ...
+** smop4s za7\.d, z0\.h, z30\.h
+** ret
+*/
+TEST_UNIFORM_ZA (mop4s_1x1_za64_s16_s16_7, svint16_t,
+ svmop4s_1x1_za64_s16_s16 (7, z0, z1),
+ svmop4s_za64 (7, z0, z1));
+
+/*
+** mop4s_1x2_za64_s16_s16_0:
+** ...
+** smop4s za0\.d, z0\.h, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4s_1x2_za64_s16_s16_0, svint16_t, svint16x2_t,
+ svmop4s_1x2_za64_s16_s16 (0, z0, z4),
+ svmop4s_za64 (0, z0, z4));
+
+/*
+** mop4s_1x2_za64_s16_s16_7:
+** ...
+** smop4s za7\.d, z0\.h, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4s_1x2_za64_s16_s16_7, svint16_t, svint16x2_t,
+ svmop4s_1x2_za64_s16_s16 (7, z0, z4),
+ svmop4s_za64 (7, z0, z4));
+
+/*
+** mop4s_2x1_za64_s16_s16_0:
+** ...
+** smop4s za0\.d, {z0\.h - z1\.h}, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4s_2x1_za64_s16_s16_0, svint16x2_t, svint16_t,
+ svmop4s_2x1_za64_s16_s16 (0, z0, z4),
+ svmop4s_za64 (0, z0, z4));
+
+/*
+** mop4s_2x1_za64_s16_s16_7:
+** ...
+** smop4s za7\.d, {z0\.h - z1\.h}, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4s_2x1_za64_s16_s16_7, svint16x2_t, svint16_t,
+ svmop4s_2x1_za64_s16_s16 (7, z0, z4),
+ svmop4s_za64 (7, z0, z4));
+
+/*
+** mop4s_2x2_za64_s16_s16_0:
+** ...
+** smop4s za0\.d, {z0\.h - z1\.h}, {z30\.h - z31\.h}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4s_2x2_za64_s16_s16_0, svint16x2_t,
+ svmop4s_2x2_za64_s16_s16 (0, z0, z1),
+ svmop4s_za64 (0, z0, z1));
+
+/*
+** mop4s_2x2_za64_s16_s16_7:
+** ...
+** smop4s za7\.d, {z0\.h - z1\.h}, {z30\.h - z31\.h}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4s_2x2_za64_s16_s16_7, svint16x2_t,
+ svmop4s_2x2_za64_s16_s16 (7, z0, z1),
+ svmop4s_za64 (7, z0, z1));
diff --git
a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za64_s16_u16.c
b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za64_s16_u16.c
new file mode 100644
index 00000000000..41479abdfdf
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za64_s16_u16.c
@@ -0,0 +1,85 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#pragma GCC target "+sve2,+sme-mop4,+sme-i16i64"
+#include <arm_sme.h>
+#include "test_sme2_acle.h"
+
+/*
+** mop4s_1x1_za64_s16_u16_0:
+** ...
+** sumop4s za0\.d, z0\.h, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4s_1x1_za64_s16_u16_0, svint16_t, svuint16_t,
+ svmop4s_1x1_za64_s16_u16 (0, z0, z4),
+ svmop4s_za64 (0, z0, z4));
+
+/*
+** mop4s_1x1_za64_s16_u16_7:
+** ...
+** sumop4s za7\.d, z0\.h, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4s_1x1_za64_s16_u16_7, svint16_t, svuint16_t,
+ svmop4s_1x1_za64_s16_u16 (7, z0, z4),
+ svmop4s_za64 (7, z0, z4));
+
+/*
+** mop4s_1x2_za64_s16_u16_0:
+** ...
+** sumop4s za0\.d, z0\.h, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4s_1x2_za64_s16_u16_0, svint16_t, svuint16x2_t,
+ svmop4s_1x2_za64_s16_u16 (0, z0, z4),
+ svmop4s_za64 (0, z0, z4));
+
+/*
+** mop4s_1x2_za64_s16_u16_7:
+** ...
+** sumop4s za7\.d, z0\.h, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4s_1x2_za64_s16_u16_7, svint16_t, svuint16x2_t,
+ svmop4s_1x2_za64_s16_u16 (7, z0, z4),
+ svmop4s_za64 (7, z0, z4));
+
+/*
+** mop4s_2x1_za64_s16_u16_0:
+** ...
+** sumop4s za0\.d, {z0\.h - z1\.h}, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4s_2x1_za64_s16_u16_0, svint16x2_t, svuint16_t,
+ svmop4s_2x1_za64_s16_u16 (0, z0, z4),
+ svmop4s_za64 (0, z0, z4));
+
+/*
+** mop4s_2x1_za64_s16_u16_7:
+** ...
+** sumop4s za7\.d, {z0\.h - z1\.h}, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4s_2x1_za64_s16_u16_7, svint16x2_t, svuint16_t,
+ svmop4s_2x1_za64_s16_u16 (7, z0, z4),
+ svmop4s_za64 (7, z0, z4));
+
+/*
+** mop4s_2x2_za64_s16_u16_0:
+** ...
+** sumop4s za0\.d, {z0\.h - z1\.h}, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4s_2x2_za64_s16_u16_0, svint16x2_t, svuint16x2_t,
+ svmop4s_2x2_za64_s16_u16 (0, z0, z4),
+ svmop4s_za64 (0, z0, z4));
+
+/*
+** mop4s_2x2_za64_s16_u16_7:
+** ...
+** sumop4s za7\.d, {z0\.h - z1\.h}, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4s_2x2_za64_s16_u16_7, svint16x2_t, svuint16x2_t,
+ svmop4s_2x2_za64_s16_u16 (7, z0, z4),
+ svmop4s_za64 (7, z0, z4));
diff --git
a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za64_u16_s16.c
b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za64_u16_s16.c
new file mode 100644
index 00000000000..128a73b6d28
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za64_u16_s16.c
@@ -0,0 +1,85 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#pragma GCC target "+sve2,+sme-mop4,+sme-i16i64"
+#include <arm_sme.h>
+#include "test_sme2_acle.h"
+
+/*
+** mop4s_1x1_za64_u16_s16_0:
+** ...
+** usmop4s za0\.d, z0\.h, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4s_1x1_za64_u16_s16_0, svuint16_t, svint16_t,
+ svmop4s_1x1_za64_u16_s16 (0, z0, z4),
+ svmop4s_za64 (0, z0, z4));
+
+/*
+** mop4s_1x1_za64_u16_s16_7:
+** ...
+** usmop4s za7\.d, z0\.h, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4s_1x1_za64_u16_s16_7, svuint16_t, svint16_t,
+ svmop4s_1x1_za64_u16_s16 (7, z0, z4),
+ svmop4s_za64 (7, z0, z4));
+
+/*
+** mop4s_1x2_za64_u16_s16_0:
+** ...
+** usmop4s za0\.d, z0\.h, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4s_1x2_za64_u16_s16_0, svuint16_t, svint16x2_t,
+ svmop4s_1x2_za64_u16_s16 (0, z0, z4),
+ svmop4s_za64 (0, z0, z4));
+
+/*
+** mop4s_1x2_za64_u16_s16_7:
+** ...
+** usmop4s za7\.d, z0\.h, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4s_1x2_za64_u16_s16_7, svuint16_t, svint16x2_t,
+ svmop4s_1x2_za64_u16_s16 (7, z0, z4),
+ svmop4s_za64 (7, z0, z4));
+
+/*
+** mop4s_2x1_za64_u16_s16_0:
+** ...
+** usmop4s za0\.d, {z0\.h - z1\.h}, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4s_2x1_za64_u16_s16_0, svuint16x2_t, svint16_t,
+ svmop4s_2x1_za64_u16_s16 (0, z0, z4),
+ svmop4s_za64 (0, z0, z4));
+
+/*
+** mop4s_2x1_za64_u16_s16_7:
+** ...
+** usmop4s za7\.d, {z0\.h - z1\.h}, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4s_2x1_za64_u16_s16_7, svuint16x2_t, svint16_t,
+ svmop4s_2x1_za64_u16_s16 (7, z0, z4),
+ svmop4s_za64 (7, z0, z4));
+
+/*
+** mop4s_2x2_za64_u16_s16_0:
+** ...
+** usmop4s za0\.d, {z0\.h - z1\.h}, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4s_2x2_za64_u16_s16_0, svuint16x2_t, svint16x2_t,
+ svmop4s_2x2_za64_u16_s16 (0, z0, z4),
+ svmop4s_za64 (0, z0, z4));
+
+/*
+** mop4s_2x2_za64_u16_s16_7:
+** ...
+** usmop4s za7\.d, {z0\.h - z1\.h}, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4s_2x2_za64_u16_s16_7, svuint16x2_t, svint16x2_t,
+ svmop4s_2x2_za64_u16_s16 (7, z0, z4),
+ svmop4s_za64 (7, z0, z4));
diff --git
a/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za64_u16_u16.c
b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za64_u16_u16.c
new file mode 100644
index 00000000000..cf0ec1741e5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/mop4s_za64_u16_u16.c
@@ -0,0 +1,85 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#pragma GCC target "+sve2,+sme-mop4,+sme-i16i64"
+#include <arm_sme.h>
+#include "test_sme2_acle.h"
+
+/*
+** mop4s_1x1_za64_u16_u16_0:
+** ...
+** umop4s za0\.d, z0\.h, z30\.h
+** ret
+*/
+TEST_UNIFORM_ZA (mop4s_1x1_za64_u16_u16_0, svuint16_t,
+ svmop4s_1x1_za64_u16_u16 (0, z0, z1),
+ svmop4s_za64 (0, z0, z1));
+
+/*
+** mop4s_1x1_za64_u16_u16_7:
+** ...
+** umop4s za7\.d, z0\.h, z30\.h
+** ret
+*/
+TEST_UNIFORM_ZA (mop4s_1x1_za64_u16_u16_7, svuint16_t,
+ svmop4s_1x1_za64_u16_u16 (7, z0, z1),
+ svmop4s_za64 (7, z0, z1));
+
+/*
+** mop4s_1x2_za64_u16_u16_0:
+** ...
+** umop4s za0\.d, z0\.h, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4s_1x2_za64_u16_u16_0, svuint16_t, svuint16x2_t,
+ svmop4s_1x2_za64_u16_u16 (0, z0, z4),
+ svmop4s_za64 (0, z0, z4));
+
+/*
+** mop4s_1x2_za64_u16_u16_7:
+** ...
+** umop4s za7\.d, z0\.h, {z30\.h - z31\.h}
+** ret
+*/
+TEST_DUAL_ZA (mop4s_1x2_za64_u16_u16_7, svuint16_t, svuint16x2_t,
+ svmop4s_1x2_za64_u16_u16 (7, z0, z4),
+ svmop4s_za64 (7, z0, z4));
+
+/*
+** mop4s_2x1_za64_u16_u16_0:
+** ...
+** umop4s za0\.d, {z0\.h - z1\.h}, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4s_2x1_za64_u16_u16_0, svuint16x2_t, svuint16_t,
+ svmop4s_2x1_za64_u16_u16 (0, z0, z4),
+ svmop4s_za64 (0, z0, z4));
+
+/*
+** mop4s_2x1_za64_u16_u16_7:
+** ...
+** umop4s za7\.d, {z0\.h - z1\.h}, z30\.h
+** ret
+*/
+TEST_DUAL_ZA (mop4s_2x1_za64_u16_u16_7, svuint16x2_t, svuint16_t,
+ svmop4s_2x1_za64_u16_u16 (7, z0, z4),
+ svmop4s_za64 (7, z0, z4));
+
+/*
+** mop4s_2x2_za64_u16_u16_0:
+** ...
+** umop4s za0\.d, {z0\.h - z1\.h}, {z30\.h - z31\.h}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4s_2x2_za64_u16_u16_0, svuint16x2_t,
+ svmop4s_2x2_za64_u16_u16 (0, z0, z1),
+ svmop4s_za64 (0, z0, z1));
+
+/*
+** mop4s_2x2_za64_u16_u16_7:
+** ...
+** umop4s za7\.d, {z0\.h - z1\.h}, {z30\.h - z31\.h}
+** ret
+*/
+TEST_UNIFORM_ZA (mop4s_2x2_za64_u16_u16_7, svuint16x2_t,
+ svmop4s_2x2_za64_u16_u16 (7, z0, z1),
+ svmop4s_za64 (7, z0, z1));
--
2.43.0