@@ -289,6 +289,87 @@ multiclass ZAFPOuterProd<string n_suffix> {
289
289
defm SVMOPA : ZAFPOuterProd<"mopa">;
290
290
defm SVMOPS : ZAFPOuterProd<"mops">;
291
291
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
+
292
373
////////////////////////////////////////////////////////////////////////////////
293
374
// SME2 - ADD, SUB
294
375
0 commit comments