Skip to content

Commit 6892d54

Browse files
[Clang][LLVM] Implement single-single vectors MOP4{A/S} (#127797)
Implement all single-single {BF/F/S/U/SU/US}MOP4{A/S} instructions in clang and llvm following the acle in https://github.com/ARM-software/acle/pull/381/files
1 parent 8f56394 commit 6892d54

File tree

7 files changed

+1175
-53
lines changed

7 files changed

+1175
-53
lines changed

clang/include/clang/Basic/arm_sme.td

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,87 @@ multiclass ZAFPOuterProd<string n_suffix> {
289289
defm SVMOPA : ZAFPOuterProd<"mopa">;
290290
defm 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

Comments
 (0)