@@ -289,6 +289,87 @@ multiclass ZAFPOuterProd<string n_suffix> {
289289defm SVMOPA : ZAFPOuterProd<"mopa">;
290290defm SVMOPS : ZAFPOuterProd<"mops">;
291291
292+ ////////////////////////////////////////////////////////////////////////////////
293+ // SME2 - FMOP4A, FMOP4S, BFMOP4A, BFMOP4S
294+
295+ multiclass MOP4<string mode, string za, string t, string i, list<ImmCheck> checks> {
296+ def _1x1 : Inst<"svmop4" # mode # "[_1x1]" # za # "[_{d}_{d}]", "vidd", t, MergeNone, i # "_1x1", [IsInOutZA, IsStreaming], checks>;
297+ }
298+
299+ let SMETargetGuard = "sme2,sme-mop4" in {
300+ defm SVFMOP4A_HtoS : MOP4<"a", "_za32", "hb", "aarch64_sme_mop4a_wide", [ImmCheck<0, ImmCheck0_3>]>;
301+ defm SVFMOP4S_HtoS : MOP4<"s", "_za32", "hb", "aarch64_sme_mop4s_wide", [ImmCheck<0, ImmCheck0_3>]>;
302+ defm SVFMOP4A_S : MOP4<"a", "_za32", "f", "aarch64_sme_mop4a", [ImmCheck<0, ImmCheck0_3>]>;
303+ defm SVFMOP4S_S : MOP4<"s", "_za32", "f", "aarch64_sme_mop4s", [ImmCheck<0, ImmCheck0_3>]>;
304+ }
305+
306+ let SMETargetGuard = "sme2,sme-mop4,sme-f64f64" in {
307+ defm SVFMOP4A_D : MOP4<"a", "_za64", "d", "aarch64_sme_mop4a", [ImmCheck<0, ImmCheck0_7>]>;
308+ defm SVFMOP4S_D : MOP4<"s", "_za64", "d", "aarch64_sme_mop4s", [ImmCheck<0, ImmCheck0_7>]>;
309+ }
310+
311+ let SMETargetGuard = "sme2,sme-mop4,sme-f16f16" in {
312+ defm SVFMOP4A_H : MOP4<"a", "_za16", "h", "aarch64_sme_mop4a", [ImmCheck<0, ImmCheck0_1>]>;
313+ defm SVFMOP4S_H : MOP4<"s", "_za16", "h", "aarch64_sme_mop4s", [ImmCheck<0, ImmCheck0_1>]>;
314+ }
315+
316+ let SMETargetGuard = "sme2,sme-mop4,sme-b16b16" in {
317+ defm SVBMOP4A_H : MOP4<"a", "_za16", "b", "aarch64_sme_mop4a", [ImmCheck<0, ImmCheck0_1>]>;
318+ defm SVBMOP4S_H : MOP4<"s", "_za16", "b", "aarch64_sme_mop4s", [ImmCheck<0, ImmCheck0_1>]>;
319+ }
320+
321+ ////////////////////////////////////////////////////////////////////////////////
322+ // SME2 - SMOP4A, SMOP4S, UMOP4A, UMOP4S
323+
324+ let SMETargetGuard = "sme2,sme-mop4" in {
325+ defm SVSMOP4A_H : MOP4<"a", "_za32", "cs", "aarch64_sme_smop4a_wide", [ImmCheck<0, ImmCheck0_3>]>;
326+ defm SVSMOP4S_H : MOP4<"s", "_za32", "cs", "aarch64_sme_smop4s_wide", [ImmCheck<0, ImmCheck0_3>]>;
327+
328+ defm SVUMOP4A_H : MOP4<"a", "_za32", "UcUs", "aarch64_sme_umop4a_wide", [ImmCheck<0, ImmCheck0_3>]>;
329+ defm SVUMOP4S_H : MOP4<"s", "_za32", "UcUs", "aarch64_sme_umop4s_wide", [ImmCheck<0, ImmCheck0_3>]>;
330+ }
331+
332+ let SMETargetGuard = "sme2,sme-mop4,sme-i16i64" in {
333+ defm SVSMOP4A_HtoD : MOP4<"a", "_za64", "s", "aarch64_sme_smop4a_za64_wide", [ImmCheck<0, ImmCheck0_7>]>;
334+ defm SVSMOP4S_HtoD : MOP4<"s", "_za64", "s", "aarch64_sme_smop4s_za64_wide", [ImmCheck<0, ImmCheck0_7>]>;
335+
336+ defm SVUMOP4A_HtoD : MOP4<"a", "_za64", "Us", "aarch64_sme_umop4a_za64_wide", [ImmCheck<0, ImmCheck0_7>]>;
337+ defm SVUMOP4S_HtoD : MOP4<"s", "_za64", "Us", "aarch64_sme_umop4s_za64_wide", [ImmCheck<0, ImmCheck0_7>]>;
338+ }
339+
340+ ////////////////////////////////////////////////////////////////////////////////
341+ // SME2 - SUMOP4A, SUMOP4S, USMOP4A, USMOP4S
342+
343+ multiclass SUMOP4<string mode, string za, string t, string i, list<ImmCheck> checks> {
344+ def _1x1 : SInst<"svmop4" # mode # "[_1x1]" # za # "[_{d}_{3}]",
345+ "vidu", t, MergeNone, "aarch64_sme_sumop4" # mode # i # "_wide_1x1",
346+ [IsStreaming, IsInOutZA],
347+ checks>;
348+ }
349+
350+ multiclass USMOP4<string mode, string za, string t, string i, list<ImmCheck> checks> {
351+ def _1x1 : SInst<"svmop4" # mode # "[_1x1]" # za # "[_{d}_{3}]",
352+ "vidx", t, MergeNone, "aarch64_sme_usmop4" # mode # i # "_wide_1x1",
353+ [IsStreaming, IsInOutZA],
354+ checks>;
355+ }
356+
357+ let SMETargetGuard = "sme2,sme-mop4" in {
358+ defm SVSUMOP4A_S : SUMOP4<"a", "_za32", "c", "", [ImmCheck<0, ImmCheck0_3>]>;
359+ defm SVSUMOP4S_S : SUMOP4<"s", "_za32", "c", "", [ImmCheck<0, ImmCheck0_3>]>;
360+
361+ defm SVUSMOP4A_S : USMOP4<"a", "_za32", "Uc", "", [ImmCheck<0, ImmCheck0_3>]>;
362+ defm SVUSMOP4S_S : USMOP4<"s", "_za32", "Uc", "", [ImmCheck<0, ImmCheck0_3>]>;
363+ }
364+
365+ let SMETargetGuard = "sme2,sme-mop4,sme-i16i64" in {
366+ defm SVSUMOP4A_D : SUMOP4<"a", "_za64", "s", "_za64", [ImmCheck<0, ImmCheck0_7>]>;
367+ defm SVSUMOP4S_D : SUMOP4<"s", "_za64", "s", "_za64", [ImmCheck<0, ImmCheck0_7>]>;
368+
369+ defm SVUSMOP4A_D : USMOP4<"a", "_za64", "Us", "_za64", [ImmCheck<0, ImmCheck0_7>]>;
370+ defm SVUSMOP4S_D : USMOP4<"s", "_za64", "Us", "_za64", [ImmCheck<0, ImmCheck0_7>]>;
371+ }
372+
292373////////////////////////////////////////////////////////////////////////////////
293374// SME2 - ADD, SUB
294375
0 commit comments