From: Ezra Sitorus <[email protected]>

This patch adds support for FEAT_F16F32MM, FEAT_F16MM and FEAT_SVE_B16MM
intrinsics.

gcc/ChangeLog:
        * config/aarch64/aarch64-c.cc: Add new __ARM_FEATURE__ macros.
        * config/aarch64/aarch64-simd-builtins.def (fmmlaqv8hf, fmmlaqv4sf): 
Define.
        * config/aarch64/aarch64-simd-pragma-builtins.def (vmmlaq_f32_f16,
          vmmlaq_f16_f16): Add new intrinsics.
        * config/aarch64/aarch64-simd.md (@aarch64_fmmlaq<mode>): New
          pattern.
        * config/aarch64/aarch64-sve-builtins-base.cc: Update
          svmmla_impl::expand for new instructions.
        * config/aarch64/aarch64-sve-builtins-sve2.def (svmmla): Add new
          intrinsics.
        * config/aarch64/aarch64-sve2.md
          (@aarch64_sve2_fmmla<SVE_FULL_HF_FMMLA:mode><SVE_FULL_HF_FMMLA:mode>):
          New pattern.
        * config/aarch64/aarch64.h (TARGET_F16F32MM, TARGET_F16MM,
          TARGET_SVE_B16MM): New macro.
        * config/aarch64/arm_neon.h (vmmlaq_f32_f16): New intrinsic.
          (vmmlaq_f16_f16): Likewise.
        * config/aarch64/iterators.md (VDQ_HSF_HF_FMMLA): New iterator.
          (SVE_FULL_HF_FMMLA): Likewise.

gcc/testsuite/ChangeLog:
        * lib/target-supports.exp ("f16mm", "f16f32mm", "sve-b16mm"):
          Add new extensions.
        * gcc.target/aarch64/advsimd-intrinsics/fmmla-compile.c: New
          test.
        * gcc.target/aarch64/pragma_cpp_predefs_4.c: Test new feature
          macros.
        * gcc.target/aarch64/sve/acle/general-c/mmla_1.c: Remove test
          that now works.
        * gcc.target/aarch64/sve2/acle/asm/fmmla_bf16mm_sve2.c: New
          test.
        * gcc.target/aarch64/sve2/acle/asm/fmmla_f16mm_sve2.c: New test.
---
 gcc/config/aarch64/aarch64-c.cc               |  3 +++
 gcc/config/aarch64/aarch64-simd-builtins.def  |  6 +++++
 .../aarch64/aarch64-simd-pragma-builtins.def  | 10 +++++++
 gcc/config/aarch64/aarch64-simd.md            | 12 +++++++++
 .../aarch64/aarch64-sve-builtins-base.cc      |  8 +++++-
 .../aarch64/aarch64-sve-builtins-sve2.def     | 10 +++++++
 gcc/config/aarch64/aarch64-sve2.md            | 23 ++++++++++++++++
 gcc/config/aarch64/aarch64.h                  |  6 +++++
 gcc/config/aarch64/arm_neon.h                 | 14 ++++++++++
 gcc/config/aarch64/iterators.md               |  7 +++++
 .../advsimd-intrinsics/fmmla-compile.c        | 26 ++++++++++++++++++
 .../gcc.target/aarch64/pragma_cpp_predefs_4.c | 15 +++++++++++
 .../aarch64/sve/acle/general-c/mmla_1.c       |  1 -
 .../aarch64/sve2/acle/asm/fmmla_bf16mm_sve2.c | 27 +++++++++++++++++++
 .../aarch64/sve2/acle/asm/fmmla_f16mm_sve2.c  | 27 +++++++++++++++++++
 gcc/testsuite/lib/target-supports.exp         |  2 +-
 16 files changed, 194 insertions(+), 3 deletions(-)
 create mode 100644 
gcc/testsuite/gcc.target/aarch64/advsimd-intrinsics/fmmla-compile.c
 create mode 100644 
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/fmmla_bf16mm_sve2.c
 create mode 100644 
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/fmmla_f16mm_sve2.c

diff --git a/gcc/config/aarch64/aarch64-c.cc b/gcc/config/aarch64/aarch64-c.cc
index 2168dbf6c85..dfc96016996 100644
--- a/gcc/config/aarch64/aarch64-c.cc
+++ b/gcc/config/aarch64/aarch64-c.cc
@@ -347,6 +347,9 @@ aarch64_update_cpp_builtins (cpp_reader *pfile)
 
   aarch64_def_or_undef (TARGET_F8F16MM, "__ARM_FEATURE_F8F16MM", pfile);
   aarch64_def_or_undef (TARGET_F8F32MM, "__ARM_FEATURE_F8F32MM", pfile);
+  aarch64_def_or_undef (TARGET_F16MM, "__ARM_FEATURE_F16MM", pfile);
+  aarch64_def_or_undef (TARGET_F16F32MM, "__ARM_FEATURE_F16F32MM", pfile);
+  aarch64_def_or_undef (TARGET_SVE_B16MM, "__ARM_FEATURE_SVE_B16MM", pfile);
   aarch64_def_or_undef (TARGET_SVE_F16F32MM, "__ARM_FEATURE_SVE_F16F32MM",
                        pfile);
 }
diff --git a/gcc/config/aarch64/aarch64-simd-builtins.def 
b/gcc/config/aarch64/aarch64-simd-builtins.def
index 5b5c17a7f3a..703ef79b515 100644
--- a/gcc/config/aarch64/aarch64-simd-builtins.def
+++ b/gcc/config/aarch64/aarch64-simd-builtins.def
@@ -962,6 +962,12 @@
   VAR1 (QUADOP_LANE_PAIR, simdfdot_lane, 0, QUIET, v2sf)
   VAR1 (QUADOP_LANE_PAIR, simdfdot_laneq, 0, QUIET, v4sf)
 
+  /* Implemented by aarch64_fmmlaqv8hf  */
+  VAR1 (TERNOP, fmmlaq, 0, QUIET, v8hf)
+
+  /* Implemented by aarch64_fmmlaqv4sf  */
+  VAR1 (TERNOP, fmmlaq, 0, QUIET, v4sf)
+
   /* Implemented by aarch64_bfmmlaqv4sf  */
   VAR1 (TERNOP, bfmmlaq, 0, QUIET, v4sf)
 
diff --git a/gcc/config/aarch64/aarch64-simd-pragma-builtins.def 
b/gcc/config/aarch64/aarch64-simd-pragma-builtins.def
index 41bafb2a96e..ee7ebcb3a09 100644
--- a/gcc/config/aarch64/aarch64-simd-pragma-builtins.def
+++ b/gcc/config/aarch64/aarch64-simd-pragma-builtins.def
@@ -306,6 +306,16 @@ ENTRY_TERNARY (vmmlaq_f16_mf8, f16q, f16q, mf8q, mf8q, 
UNSPEC_FMMLA, FP8)
 ENTRY_TERNARY (vmmlaq_f32_mf8, f32q, f32q, mf8q, mf8q, UNSPEC_FMMLA, FP8)
 #undef REQUIRED_EXTENSIONS
 
+// mmla f32 f16
+#define REQUIRED_EXTENSIONS nonstreaming_only (AARCH64_FL_F16F32MM)
+ENTRY_TERNARY (vmmlaq_f32_f16, f32q, f32q, f16q, f16q, UNSPEC_FMMLA, QUIET)
+#undef REQUIRED_EXTENSIONS
+
+// mmla f16 f16
+#define REQUIRED_EXTENSIONS nonstreaming_only (AARCH64_FL_F16MM)
+ENTRY_TERNARY (vmmlaq_f16_f16, f16q, f16q, f16q, f16q, UNSPEC_FMMLA, QUIET)
+#undef REQUIRED_EXTENSIONS
+
 // mov
 #define REQUIRED_EXTENSIONS nonstreaming_only (AARCH64_FL_SIMD)
 ENTRY_UNARY (vmov_n_mf8, mf8, mf8_scalar, UNSPEC_DUP, QUIET)
diff --git a/gcc/config/aarch64/aarch64-simd.md 
b/gcc/config/aarch64/aarch64-simd.md
index 8a5059f4ec1..1a197ae820e 100644
--- a/gcc/config/aarch64/aarch64-simd.md
+++ b/gcc/config/aarch64/aarch64-simd.md
@@ -10689,6 +10689,18 @@
   [(set_attr "type" "neon_fp_mla_s_q")]
 )
 
+;; fmmla
+(define_insn "@aarch64_fmmlaq<mode>"
+  [(set (match_operand:VDQ_HSF_HF_FMMLA 0 "register_operand" "=w")
+        (plus:VDQ_HSF_HF_FMMLA (match_operand:VDQ_HSF_HF_FMMLA 1 
"register_operand" "0")
+                   (unspec:VDQ_HSF_HF_FMMLA [(match_operand:V8HF 2 
"register_operand" "w")
+                                 (match_operand:V8HF 3 "register_operand" "w")]
+                    UNSPEC_FMMLA)))]
+  ""
+  "fmmla\t%0.<Vtype>, %2.8h, %3.8h"
+  [(set_attr "type" "neon_fp_mla_s_q")]
+)
+
 ;; bfmlal<bt>
 (define_insn "aarch64_bfmlal<bt>v4sf"
   [(set (match_operand:V4SF 0 "register_operand" "=w")
diff --git a/gcc/config/aarch64/aarch64-sve-builtins-base.cc 
b/gcc/config/aarch64/aarch64-sve-builtins-base.cc
index 212002574e8..d2627ab1831 100644
--- a/gcc/config/aarch64/aarch64-sve-builtins-base.cc
+++ b/gcc/config/aarch64/aarch64-sve-builtins-base.cc
@@ -2327,7 +2327,13 @@ public:
     else
       {
        if (e.type_suffix_ids[1] == NUM_TYPE_SUFFIXES)
-         icode = code_for_aarch64_sve (UNSPEC_FMMLA, e.vector_mode (0));
+         {
+           if (e.type_suffix (0).element_bytes == 2)
+             icode = code_for_aarch64_sve2_fmmla (e.vector_mode (0),
+                                                  e.vector_mode (0));
+           else
+             icode = code_for_aarch64_sve (UNSPEC_FMMLA, e.vector_mode (0));
+         }
        else
          icode = code_for_aarch64_sve2 (UNSPEC_FMMLA,
                                        e.vector_mode (0),
diff --git a/gcc/config/aarch64/aarch64-sve-builtins-sve2.def 
b/gcc/config/aarch64/aarch64-sve-builtins-sve2.def
index 5c348bbb1d8..88d8eabfb24 100644
--- a/gcc/config/aarch64/aarch64-sve-builtins-sve2.def
+++ b/gcc/config/aarch64/aarch64-sve-builtins-sve2.def
@@ -492,6 +492,16 @@ DEF_SVE_FUNCTION_GS_FPM (svmmla, mmla, s_float_mf8, none, 
none, set)
 DEF_SVE_FUNCTION (svmmla, mmla, cvt_f32_f16, none)
 #undef REQUIRED_EXTENSIONS
 
+#define REQUIRED_EXTENSIONS \
+  nonstreaming_sve (AARCH64_FL_SVE_B16MM)
+DEF_SVE_FUNCTION_GS (svmmla, mmla, h_bfloat, none, none)
+#undef REQUIRED_EXTENSIONS
+
+#define REQUIRED_EXTENSIONS \
+  nonstreaming_sve (AARCH64_FL_F16MM)
+DEF_SVE_FUNCTION_GS (svmmla, mmla, h_float, none, none)
+#undef REQUIRED_EXTENSIONS
+
 /*
 - BFSCALE (predicated)
   // Only if __ARM_FEATURE_SVE_BFSCALE != 0 && __ARM_FEATURE_SVE2 != 0
diff --git a/gcc/config/aarch64/aarch64-sve2.md 
b/gcc/config/aarch64/aarch64-sve2.md
index a0713633e28..3c9754707bf 100644
--- a/gcc/config/aarch64/aarch64-sve2.md
+++ b/gcc/config/aarch64/aarch64-sve2.md
@@ -144,6 +144,7 @@
 ;;
 ;; == FMMLA extensions
 ;; ---- [FP] Matrix multiply-accumulate widening
+;; ---- [FP] Matrix multiply-accumulate non-widening
 
 ;; =========================================================================
 ;; == Moves
@@ -5098,3 +5099,25 @@
   }
   [(set_attr "sve_type" "sve_fp_mul")]
 )
+
+;; -------------------------------------------------------------------------
+;; ---- [FP] Matrix multiply-accumulate non-widening
+;; -------------------------------------------------------------------------
+;; Includes:
+;; - FMMLA (F16MM)
+;; - BFMMLA (SVE_B16MM)
+;; -------------------------------------------------------------------------
+
+(define_insn 
"@aarch64_sve2_fmmla<SVE_FULL_HF_FMMLA:mode><SVE_FULL_HF_FMMLA:mode>"
+  [(set (match_operand:SVE_FULL_HF_FMMLA 0 "register_operand")
+       (unspec:SVE_FULL_HF_FMMLA
+        [(match_operand:SVE_FULL_HF_FMMLA 2 "register_operand")
+         (match_operand:SVE_FULL_HF_FMMLA 3 "register_operand")
+         (match_operand:SVE_FULL_HF_FMMLA 1 "register_operand")]
+        FMMLA))]
+  "TARGET_SVE2 && TARGET_NON_STREAMING"
+  {@ [ cons: =0 , 1 , 2 , 3 ; attrs: movprfx ]
+     [ w        , 0 , w , w ; *              ] <b>fmmla\t%0.h, %2.h, %3.h
+  }
+  [(set_attr "sve_type" "sve_fp_mul")]
+)
diff --git a/gcc/config/aarch64/aarch64.h b/gcc/config/aarch64/aarch64.h
index 4c8ccd11eb2..1131a86c461 100644
--- a/gcc/config/aarch64/aarch64.h
+++ b/gcc/config/aarch64/aarch64.h
@@ -447,10 +447,16 @@ constexpr auto AARCH64_FL_DEFAULT_ISA_MODE 
ATTRIBUTE_UNUSED
 #define TARGET_F8F32MM (AARCH64_HAVE_ISA (F8F32MM))
 /* F8F16MM instructions, enabled through +f8f16mm.  */
 #define TARGET_F8F16MM (AARCH64_HAVE_ISA (F8F16MM))
+/* F16F32MM instructions, enabled through +f16f32mm.  */
+#define TARGET_F16F32MM (AARCH64_HAVE_ISA (F16F32MM))
+/* F16MM instructions, enabled through +f16mm.  */
+#define TARGET_F16MM (AARCH64_HAVE_ISA (F16MM))
 /* SVE_F16F32MM instructions, enabled through +sve-f16f32mm.  */
 #define TARGET_SVE_F16F32MM (AARCH64_HAVE_ISA (SVE_F16F32MM))
 /* F16F32DOT instructions enabled through +f16f32dot.  */
 #define TARGET_F16F32DOT (AARCH64_HAVE_ISA (F16F32DOT))
+/* SVE_B16MM instructions, enabled through +sve-b16mm.  */
+#define TARGET_SVE_B16MM (AARCH64_HAVE_ISA (SVE_B16MM))
 
 /* Make sure this is always defined so we don't have to check for ifdefs
    but rather use normal ifs.  */
diff --git a/gcc/config/aarch64/arm_neon.h b/gcc/config/aarch64/arm_neon.h
index 1cd905d6b7d..31a9e50caa1 100644
--- a/gcc/config/aarch64/arm_neon.h
+++ b/gcc/config/aarch64/arm_neon.h
@@ -26789,6 +26789,20 @@ vminnmvq_f16 (float16x8_t __a)
   return __builtin_aarch64_reduc_smin_scal_v8hf (__a);
 }
 
+__extension__ extern __inline float32x4_t
+__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
+vmmlaq_f32_f16 (float32x4_t __r, float16x8_t __a, float16x8_t __b)
+{
+  return __builtin_aarch64_fmmlaqv4sf (__r, __a, __b);
+}
+
+__extension__ extern __inline float16x8_t
+__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
+vmmlaq_f16_f16 (float16x8_t __r, float16x8_t __a, float16x8_t __b)
+{
+  return __builtin_aarch64_fmmlaqv8hf (__r, __a, __b);
+}
+
 #pragma GCC pop_options
 
 /* AdvSIMD Dot Product intrinsics.  */
diff --git a/gcc/config/aarch64/iterators.md b/gcc/config/aarch64/iterators.md
index d35470e6fe2..63132f39ab1 100644
--- a/gcc/config/aarch64/iterators.md
+++ b/gcc/config/aarch64/iterators.md
@@ -220,6 +220,10 @@
                                    (V2SF "TARGET_FP8DOT4")
                                    (V4SF "TARGET_FP8DOT4")])
 
+;; Same, but with the appropriate conditions for FMMLA support with FP16 
source.
+(define_mode_iterator VDQ_HSF_HF_FMMLA [(V8HF "TARGET_F16MM")
+                                    (V4SF "TARGET_F16F32MM")])
+
 (define_mode_iterator VDQ_HSF_FMMLA [(V8HF "TARGET_F8F16MM")
                                     (V4SF "TARGET_F8F32MM")])
 
@@ -578,6 +582,9 @@
 ;; Fully-packed SVE vector modes that have 16-bit float elements.
 (define_mode_iterator SVE_FULL_HF [VNx8BF VNx8HF])
 
+;; Same, but with the appropriate conditions for FMMLA support.
+(define_mode_iterator SVE_FULL_HF_FMMLA [(VNx8BF "TARGET_SVE_B16MM") (VNx8HF 
"TARGET_F16MM")])
+
 ;; Pairs of the above.
 (define_mode_iterator SVE_FULL_HFx2 [VNx16BF VNx16HF])
 
diff --git 
a/gcc/testsuite/gcc.target/aarch64/advsimd-intrinsics/fmmla-compile.c 
b/gcc/testsuite/gcc.target/aarch64/advsimd-intrinsics/fmmla-compile.c
new file mode 100644
index 00000000000..13d3b1b0223
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/advsimd-intrinsics/fmmla-compile.c
@@ -0,0 +1,26 @@
+/* { dg-do assemble { target { aarch64_asm_f16f32mm_ok && aarch64_asm_f16mm_ok 
} } } */
+/* { dg-do compile { target { ! { aarch64_asm_f16f32mm_ok && 
aarch64_asm_f16mm_ok } } } } */
+/* { dg-additional-options "-O2 -march=armv8-a+f16f32mm+f16mm -save-temps" } */
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include <arm_neon.h>
+
+/*
+**test_fmmla1:
+**     fmmla   v0.4s, v1.8h, v2.8h
+**     ret
+*/
+float32x4_t test_fmmla1 (float32x4_t r, float16x8_t x, float16x8_t y)
+{
+  return vmmlaq_f32_f16 (r, x, y);
+}
+
+/*
+**test_fmmla2:
+**     fmmla   v0.8h, v1.8h, v2.8h
+**     ret
+*/
+float16x8_t test_fmmla2 (float16x8_t r, float16x8_t x, float16x8_t y)
+{
+  return vmmlaq_f16_f16 (r, x, y);
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/pragma_cpp_predefs_4.c 
b/gcc/testsuite/gcc.target/aarch64/pragma_cpp_predefs_4.c
index cb009ec2752..aa8aaf190ee 100644
--- a/gcc/testsuite/gcc.target/aarch64/pragma_cpp_predefs_4.c
+++ b/gcc/testsuite/gcc.target/aarch64/pragma_cpp_predefs_4.c
@@ -394,6 +394,21 @@
 #error Foo
 #endif
 
+#pragma GCC target "+nothing+f16mm"
+#ifndef __ARM_FEATURE_F16MM
+#error Foo
+#endif
+
+#pragma GCC target "+nothing+f16f32mm"
+#ifndef __ARM_FEATURE_F16F32MM
+#error Foo
+#endif
+
+#pragma GCC target "+nothing+sve-b16mm"
+#ifndef __ARM_FEATURE_SVE_B16MM
+#error Foo
+#endif
+
 #pragma GCC target "arch=armv9.5-a+sme"
 #ifdef __ARM_FEATURE_SME_TMOP
 #error Foo
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/mmla_1.c 
b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/mmla_1.c
index a23c45c86b1..c616ad425c4 100644
--- a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/mmla_1.c
+++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/mmla_1.c
@@ -52,7 +52,6 @@ f2 (svbool_t pg, svint8_t s8, svuint8_t u8, svuint32_t u32, 
svint32_t s32,
   svmmla (f64, f32, f16); /* { dg-error {'svmmla' has no form that takes 
'svfloat64_t' and 'svfloat32_t' arguments} } */
   svmmla (f64, f64, f16); /* { dg-error {passing 'svfloat16_t' to argument 3 
of 'svmmla', but argument 2 had type 'svfloat64_t'} } */
 
-  svmmla (f16, f16, f16); /* { dg-error {'svmmla' has no form that takes 
'svfloat16_t' arguments} } */
   svmmla (f32, f32, f32);
   svmmla (f64, f64, f64);
 }
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/fmmla_bf16mm_sve2.c 
b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/fmmla_bf16mm_sve2.c
new file mode 100644
index 00000000000..0539a351530
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/fmmla_bf16mm_sve2.c
@@ -0,0 +1,27 @@
+/* { dg-do assemble { target aarch64_asm_sve-b16mm_ok } } */
+/* { dg-do compile { target { ! aarch64_asm_sve-b16mm_ok } } } */
+/* { dg-skip-if "" { *-*-* } { "-DSTREAMING_COMPATIBLE" } { "" } } */
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sve+sve-b16mm"
+
+/*
+** svmmla_bf16mm_tied:
+**     bfmmla  z0\.h, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (svmmla_bf16mm_tied, svbfloat16_t, svbfloat16_t,
+            z0 = svmmla_bf16 (z0, z4, z5),
+            z0 = svmmla (z0, z4, z5))
+
+/*
+** svmmla_bf16mm:
+**     bfmmla  z1\.h, z4\.h, z5\.h
+**     mov     z0\.d, z1\.d
+**     ret
+*/
+TEST_DUAL_Z (svmmla_bf16mm, svbfloat16_t, svbfloat16_t,
+            z0 = svmmla_bf16 (z1, z4, z5),
+            z0 = svmmla (z1, z4, z5))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/fmmla_f16mm_sve2.c 
b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/fmmla_f16mm_sve2.c
new file mode 100644
index 00000000000..efa4f96481b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/fmmla_f16mm_sve2.c
@@ -0,0 +1,27 @@
+/* { dg-do assemble { target aarch64_asm_f16mm_ok } } */
+/* { dg-do compile { target { ! aarch64_asm_f16mm_ok } } } */
+/* { dg-skip-if "" { *-*-* } { "-DSTREAMING_COMPATIBLE" } { "" } } */
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sve+f16mm"
+
+/*
+** svmmla_f16mm_tied:
+**     fmmla   z0\.h, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (svmmla_f16mm_tied, svfloat16_t, svfloat16_t,
+            z0 = svmmla_f16 (z0, z4, z5),
+            z0 = svmmla (z0, z4, z5))
+
+/*
+** svmmla_f16mm:
+**     fmmla   z1\.h, z4\.h, z5\.h
+**     mov     z0\.d, z1\.d
+**     ret
+*/
+TEST_DUAL_Z (svmmla_f16mm, svfloat16_t, svfloat16_t,
+            z0 = svmmla_f16 (z1, z4, z5),
+            z0 = svmmla (z1, z4, z5))
diff --git a/gcc/testsuite/lib/target-supports.exp 
b/gcc/testsuite/lib/target-supports.exp
index ad7ba8ba213..c34814ca76a 100644
--- a/gcc/testsuite/lib/target-supports.exp
+++ b/gcc/testsuite/lib/target-supports.exp
@@ -12878,7 +12878,7 @@ set exts {
     "bf16" "cmpbr" "crc" "crypto" "dotprod" "f32mm" "f64mm" "faminmax"
     "fp" "fp8" "fp8dot2" "fp8dot4" "fp8fma" "i8mm" "ls64" "lse" "lut"
     "sb" "simd" "sve-b16b16" "sve" "sve2" "sve2p3" "sve-sm4" "sve-aes" 
"sve-bitperm"
-    "sve-sha3" "f8f16mm" "f8f32mm" "sve-f16f32mm"
+    "sve-sha3" "f8f16mm" "f8f32mm" "sve-f16f32mm" "f16mm" "f16f32mm" 
"sve-b16mm"
     "sme-f8f16" "sme-f8f32"
     "sme-b16b16" "sme-f16f16" "sme-i16i64" "sme" "sme2" "sme2p1" "sme2p2" 
"sme2p3"
     "ssve-fp8dot2" "ssve-fp8dot4" "ssve-fp8fma" "sve-bfscale" "sme-lutv2"
-- 
2.53.0

Reply via email to