@@ -27,7 +27,7 @@ def SVLD1UH : MInst<"svld1uh_{d}", "dPX", "ilUiUl", [IsLoad, IsZExtRetu
27
27
def SVLD1SW : MInst<"svld1sw_{d}", "dPU", "lUl", [IsLoad, IsSVEOrStreamingSVE], MemEltTyInt32, "aarch64_sve_ld1">;
28
28
def SVLD1UW : MInst<"svld1uw_{d}", "dPY", "lUl", [IsLoad, IsZExtReturn, IsSVEOrStreamingSVE], MemEltTyInt32, "aarch64_sve_ld1">;
29
29
30
- let TargetGuard = "sve,bf16" in {
30
+ let TargetGuard = "( sve,bf16)|sme " in {
31
31
def SVLD1_BF : MInst<"svld1[_{2}]", "dPc", "b", [IsLoad, IsSVEOrStreamingSVE], MemEltTyDefault, "aarch64_sve_ld1">;
32
32
def SVLD1_VNUM_BF : MInst<"svld1_vnum[_{2}]", "dPcl", "b", [IsLoad, IsSVEOrStreamingSVE], MemEltTyDefault, "aarch64_sve_ld1">;
33
33
}
@@ -248,21 +248,21 @@ def SVLDNT1 : MInst<"svldnt1[_{2}]", "dPc", "csilUcUsUiUlhfd", [IsLoad, IsSVEOrS
248
248
// Load one vector, unextended load, non-temporal (scalar base, VL displacement)
249
249
def SVLDNT1_VNUM : MInst<"svldnt1_vnum[_{2}]", "dPcl", "csilUcUsUiUlhfd", [IsLoad, IsSVEOrStreamingSVE], MemEltTyDefault, "aarch64_sve_ldnt1">;
250
250
251
- let TargetGuard = "sve,bf16" in {
251
+ let TargetGuard = "( sve,bf16)|sme " in {
252
252
def SVLDNT1_BF : MInst<"svldnt1[_{2}]", "dPc", "b", [IsLoad, IsSVEOrStreamingSVE], MemEltTyDefault, "aarch64_sve_ldnt1">;
253
253
def SVLDNT1_VNUM_BF : MInst<"svldnt1_vnum[_{2}]", "dPcl", "b", [IsLoad, IsSVEOrStreamingSVE], MemEltTyDefault, "aarch64_sve_ldnt1">;
254
254
}
255
255
256
256
// Load one quadword and replicate (scalar base)
257
257
def SVLD1RQ : SInst<"svld1rq[_{2}]", "dPc", "csilUcUsUiUlhfd", MergeNone, "aarch64_sve_ld1rq", [IsSVEOrStreamingSVE]>;
258
258
259
- let TargetGuard = "sve,bf16" in {
259
+ let TargetGuard = "( sve,bf16)|sme " in {
260
260
def SVLD1RQ_BF : SInst<"svld1rq[_{2}]", "dPc", "b", MergeNone, "aarch64_sve_ld1rq", [IsSVEOrStreamingSVE]>;
261
261
}
262
262
263
263
multiclass StructLoad<string name, string proto, string i> {
264
264
def : SInst<name, proto, "csilUcUsUiUlhfd", MergeNone, i, [IsStructLoad, IsSVEOrStreamingSVE]>;
265
- let TargetGuard = "sve,bf16" in {
265
+ let TargetGuard = "( sve,bf16)|sme " in {
266
266
def: SInst<name, proto, "b", MergeNone, i, [IsStructLoad, IsSVEOrStreamingSVE]>;
267
267
}
268
268
}
@@ -351,7 +351,7 @@ def SVST1H_VNUM_U : MInst<"svst1h_vnum[_{d}]", "vPFld", "UiUl", [IsSt
351
351
def SVST1W_VNUM_S : MInst<"svst1w_vnum[_{d}]", "vPCld", "l", [IsStore, IsSVEOrStreamingSVE], MemEltTyInt32, "aarch64_sve_st1">;
352
352
def SVST1W_VNUM_U : MInst<"svst1w_vnum[_{d}]", "vPGld", "Ul", [IsStore, IsSVEOrStreamingSVE], MemEltTyInt32, "aarch64_sve_st1">;
353
353
354
- let TargetGuard = "sve,bf16" in {
354
+ let TargetGuard = "( sve,bf16)|sme " in {
355
355
def SVST1_BF : MInst<"svst1[_{d}]", "vPpd", "b", [IsStore, IsSVEOrStreamingSVE], MemEltTyDefault, "aarch64_sve_st1">;
356
356
def SVST1_VNUM_BF : MInst<"svst1_vnum[_{d}]", "vPpld", "b", [IsStore, IsSVEOrStreamingSVE], MemEltTyDefault, "aarch64_sve_st1">;
357
357
}
@@ -447,7 +447,7 @@ def SVSTNT1 : MInst<"svstnt1[_{d}]", "vPpd", "csilUcUsUiUlhfd", [IsStore, IsSVEO
447
447
// Store one vector, with no truncation, non-temporal (scalar base, VL displacement)
448
448
def SVSTNT1_VNUM : MInst<"svstnt1_vnum[_{d}]", "vPpld", "csilUcUsUiUlhfd", [IsStore, IsSVEOrStreamingSVE], MemEltTyDefault, "aarch64_sve_stnt1">;
449
449
450
- let TargetGuard = "sve,bf16" in {
450
+ let TargetGuard = "( sve,bf16)|sme " in {
451
451
def SVSTNT1_BF : MInst<"svstnt1[_{d}]", "vPpd", "b", [IsStore, IsSVEOrStreamingSVE], MemEltTyDefault, "aarch64_sve_stnt1">;
452
452
def SVSTNT1_VNUM_BF : MInst<"svstnt1_vnum[_{d}]", "vPpld", "b", [IsStore, IsSVEOrStreamingSVE], MemEltTyDefault, "aarch64_sve_stnt1">;
453
453
}
@@ -545,15 +545,15 @@ def SVADRD : SInst<"svadrd[_{0}base]_[{2}]index", "uud", "ilUiUl", MergeNone, "
545
545
546
546
def SVDUPQ_8 : SInst<"svdupq[_n]_{d}", "dssssssssssssssss", "cUc", MergeNone, "", [IsSVEOrStreamingSVE]>;
547
547
def SVDUPQ_16 : SInst<"svdupq[_n]_{d}", "dssssssss", "sUsh", MergeNone, "", [IsSVEOrStreamingSVE]>;
548
- let TargetGuard = "sve,bf16" in {
548
+ let TargetGuard = "( sve,bf16)|sme " in {
549
549
def SVDUPQ_BF16 : SInst<"svdupq[_n]_{d}", "dssssssss", "b", MergeNone, "", [IsSVEOrStreamingSVE]>;
550
550
}
551
551
def SVDUPQ_32 : SInst<"svdupq[_n]_{d}", "dssss", "iUif", MergeNone, "", [IsSVEOrStreamingSVE]>;
552
552
def SVDUPQ_64 : SInst<"svdupq[_n]_{d}", "dss", "lUld", MergeNone, "", [IsSVEOrStreamingSVE]>;
553
553
554
554
multiclass svdup_base<string n, string p, MergeType mt, string i> {
555
555
def NAME : SInst<n, p, "csilUcUsUiUlhfd", mt, i, [IsSVEOrStreamingSVE]>;
556
- let TargetGuard = "sve,bf16" in {
556
+ let TargetGuard = "( sve,bf16)|sme " in {
557
557
def _BF16: SInst<n, p, "b", mt, i, [IsSVEOrStreamingSVE]>;
558
558
}
559
559
}
@@ -644,7 +644,9 @@ def SVDOT_LANE_U : SInst<"svdot_lane[_{d}]", "ddqqi", "UiUl", MergeNone, "aarc
644
644
////////////////////////////////////////////////////////////////////////////////
645
645
// Logical operations
646
646
647
+ let TargetGuard = "sve|sme" in { // FIXME: Make this the default for most operations.
647
648
defm SVAND : SInstZPZZ<"svand", "csilUcUsUiUl", "aarch64_sve_and", "aarch64_sve_and_u">;
649
+ }
648
650
defm SVBIC : SInstZPZZ<"svbic", "csilUcUsUiUl", "aarch64_sve_bic", "aarch64_sve_bic_u">;
649
651
defm SVEOR : SInstZPZZ<"sveor", "csilUcUsUiUl", "aarch64_sve_eor", "aarch64_sve_eor_u">;
650
652
defm SVORR : SInstZPZZ<"svorr", "csilUcUsUiUl", "aarch64_sve_orr", "aarch64_sve_orr_u">;
@@ -682,7 +684,7 @@ def SVASRD_X : SInst<"svasrd[_n_{d}]", "dPdi", "csil", MergeAny, "aa
682
684
def SVASRD_Z : SInst<"svasrd[_n_{d}]", "dPdi", "csil", MergeZero, "aarch64_sve_asrd", [IsSVEOrStreamingSVE], [ImmCheck<2, ImmCheckShiftRight, 1>]>;
683
685
684
686
def SVINSR : SInst<"svinsr[_n_{d}]", "dds", "csilUcUsUiUlhfd", MergeNone, "aarch64_sve_insr", [IsSVEOrStreamingSVE]>;
685
- let TargetGuard = "sve,bf16" in {
687
+ let TargetGuard = "( sve,bf16)|sme " in {
686
688
def SVINSR_BF16 : SInst<"svinsr[_n_{d}]", "dds", "b", MergeNone, "aarch64_sve_insr", [IsSVEOrStreamingSVE]>;
687
689
}
688
690
@@ -771,7 +773,7 @@ defm SVCLS : SInstCLS<"svcls", "csil", "aarch64_sve_cls", [IsSVEOrStr
771
773
defm SVCLZ : SInstCLS<"svclz", "csilUcUsUiUl", "aarch64_sve_clz", [IsSVEOrStreamingSVE]>;
772
774
defm SVCNT : SInstCLS<"svcnt", "csilUcUsUiUlhfd", "aarch64_sve_cnt", [IsSVEOrStreamingSVE]>;
773
775
774
- let TargetGuard = "sve,bf16" in {
776
+ let TargetGuard = "( sve,bf16)|sme " in {
775
777
defm SVCNT_BF16 : SInstCLS<"svcnt", "b", "aarch64_sve_cnt", [IsSVEOrStreamingSVE]>;
776
778
}
777
779
@@ -800,7 +802,9 @@ defm SVABS_F : SInstZPZ<"svabs", "hfd", "aarch64_sve_fabs">;
800
802
defm SVNEG_F : SInstZPZ<"svneg", "hfd", "aarch64_sve_fneg">;
801
803
802
804
defm SVABD_F : SInstZPZZ<"svabd", "hfd", "aarch64_sve_fabd", "aarch64_sve_fabd_u">;
805
+ let TargetGuard = "sve|sme" in { // FIXME: Make this the default for most operations.
803
806
defm SVADD_F : SInstZPZZ<"svadd", "hfd", "aarch64_sve_fadd", "aarch64_sve_fadd_u">;
807
+ }
804
808
defm SVDIV_F : SInstZPZZ<"svdiv", "hfd", "aarch64_sve_fdiv", "aarch64_sve_fdiv_u">;
805
809
defm SVDIVR_F : SInstZPZZ<"svdivr", "hfd", "aarch64_sve_fdivr", "aarch64_sve_fdiv_u", [ReverseMergeAnyBinOp]>;
806
810
defm SVMAX_F : SInstZPZZ<"svmax", "hfd", "aarch64_sve_fmax", "aarch64_sve_fmax_u">;
@@ -928,7 +932,7 @@ defm SVFCVTZS_S64_F16 : SInstCvtMXZ<"svcvt_s64[_f16]", "ddPO", "dPO", "l", "aar
928
932
defm SVFCVTZS_S32_F32 : SInstCvtMXZ<"svcvt_s32[_f32]", "ddPM", "dPM", "i", "aarch64_sve_fcvtzs", [IsOverloadCvt]>;
929
933
defm SVFCVTZS_S64_F32 : SInstCvtMXZ<"svcvt_s64[_f32]", "ddPM", "dPM", "l", "aarch64_sve_fcvtzs_i64f32">;
930
934
931
- let TargetGuard = "sve,bf16" in {
935
+ let TargetGuard = "( sve,bf16)|sme " in {
932
936
defm SVCVT_BF16_F32 : SInstCvtMXZ<"svcvt_bf16[_f32]", "ddPM", "dPM", "b", "aarch64_sve_fcvt_bf16f32">;
933
937
def SVCVTNT_BF16_F32 : SInst<"svcvtnt_bf16[_f32]", "ddPM", "b", MergeOp1, "aarch64_sve_fcvtnt_bf16f32", [IsOverloadNone, IsSVEOrStreamingSVE]>;
934
938
}
@@ -1056,7 +1060,7 @@ def SVUZP2 : SInst<"svuzp2[_{d}]", "ddd", "csilUcUsUiUlhfd", MergeNo
1056
1060
def SVZIP1 : SInst<"svzip1[_{d}]", "ddd", "csilUcUsUiUlhfd", MergeNone, "aarch64_sve_zip1", [IsSVEOrStreamingSVE]>;
1057
1061
def SVZIP2 : SInst<"svzip2[_{d}]", "ddd", "csilUcUsUiUlhfd", MergeNone, "aarch64_sve_zip2", [IsSVEOrStreamingSVE]>;
1058
1062
1059
- let TargetGuard = "sve,bf16" in {
1063
+ let TargetGuard = "( sve,bf16)|sme " in {
1060
1064
def SVEXT_BF16 : SInst<"svext[_{d}]", "dddi", "b", MergeNone, "aarch64_sve_ext", [IsSVEOrStreamingSVE], [ImmCheck<2, ImmCheckExtract, 1>]>;
1061
1065
def SVREV_BF16 : SInst<"svrev[_{d}]", "dd", "b", MergeNone, "aarch64_sve_rev", [IsSVEOrStreamingSVE]>;
1062
1066
def SVSEL_BF16 : SInst<"svsel[_{d}]", "dPdd", "b", MergeNone, "aarch64_sve_sel", [IsSVEOrStreamingSVE]>;
@@ -1106,8 +1110,10 @@ def SVZIP2_B64 : SInst<"svzip2_b64", "PPP", "Pc", MergeNone, "aarch64_sve_zip
1106
1110
1107
1111
def SVPFALSE : SInst<"svpfalse[_b]", "Pv", "", MergeNone, "", [IsOverloadNone, IsSVEOrStreamingSVE]>;
1108
1112
1113
+ let TargetGuard = "sve|sme" in { // FIXME: Make this the default for most operations.
1109
1114
def SVPTRUE_PAT : SInst<"svptrue_pat_{d}", "PI", "PcPsPiPl", MergeNone, "aarch64_sve_ptrue", [IsSVEOrStreamingSVE]>;
1110
1115
def SVPTRUE : SInst<"svptrue_{d}", "Pv", "PcPsPiPl", MergeNone, "aarch64_sve_ptrue", [IsAppendSVALL, IsSVEOrStreamingSVE]>;
1116
+ }
1111
1117
1112
1118
def SVDUPQ_B8 : SInst<"svdupq[_n]_{d}", "Pssssssssssssssss", "Pc", MergeNone, "", [IsSVEOrStreamingSVE]>;
1113
1119
def SVDUPQ_B16 : SInst<"svdupq[_n]_{d}", "Pssssssss", "Ps", MergeNone, "", [IsSVEOrStreamingSVE]>;
@@ -1119,7 +1125,9 @@ def SVDUP_N_B : SInst<"svdup[_n]_{d}", "Ps", "PcPsPiPl", MergeNone, "", [I
1119
1125
////////////////////////////////////////////////////////////////////////////////
1120
1126
// Predicate operations
1121
1127
1128
+ let TargetGuard = "sve|sme" in { // FIXME: Make this the default for most operations.
1122
1129
def SVAND_B_Z : SInst<"svand[_b]_z", "PPPP", "Pc", MergeNone, "aarch64_sve_and_z", [IsSVEOrStreamingSVE]>;
1130
+ }
1123
1131
def SVBIC_B_Z : SInst<"svbic[_b]_z", "PPPP", "Pc", MergeNone, "aarch64_sve_bic_z", [IsSVEOrStreamingSVE]>;
1124
1132
def SVEOR_B_Z : SInst<"sveor[_b]_z", "PPPP", "Pc", MergeNone, "aarch64_sve_eor_z", [IsSVEOrStreamingSVE]>;
1125
1133
def SVMOV_B_Z : SInst<"svmov[_b]_z", "PPP", "Pc", MergeNone, "", [IsSVEOrStreamingSVE]>; // Uses custom expansion
@@ -1276,6 +1284,7 @@ def SVZIP2Q_BF16 : SInst<"svzip2q[_{d}]", "ddd", "b", MergeNone, "aarc
1276
1284
1277
1285
////////////////////////////////////////////////////////////////////////////////
1278
1286
// Vector creation
1287
+ let TargetGuard = "sve|sme" in { // FIXME: Make this the default for most operations.
1279
1288
def SVUNDEF_1 : SInst<"svundef_{d}", "dv", "csilUcUsUiUlhfd", MergeNone, "", [IsUndef, IsSVEOrStreamingSVE]>;
1280
1289
def SVUNDEF_2 : SInst<"svundef2_{d}", "2v", "csilUcUsUiUlhfd", MergeNone, "", [IsUndef, IsSVEOrStreamingSVE]>;
1281
1290
def SVUNDEF_3 : SInst<"svundef3_{d}", "3v", "csilUcUsUiUlhfd", MergeNone, "", [IsUndef, IsSVEOrStreamingSVE]>;
@@ -1284,8 +1293,9 @@ def SVUNDEF_4 : SInst<"svundef4_{d}", "4v", "csilUcUsUiUlhfd", MergeNone, "", [I
1284
1293
def SVCREATE_2 : SInst<"svcreate2[_{d}]", "2dd", "csilUcUsUiUlhfd", MergeNone, "", [IsTupleCreate, IsSVEOrStreamingSVE]>;
1285
1294
def SVCREATE_3 : SInst<"svcreate3[_{d}]", "3ddd", "csilUcUsUiUlhfd", MergeNone, "", [IsTupleCreate, IsSVEOrStreamingSVE]>;
1286
1295
def SVCREATE_4 : SInst<"svcreate4[_{d}]", "4dddd", "csilUcUsUiUlhfd", MergeNone, "", [IsTupleCreate, IsSVEOrStreamingSVE]>;
1296
+ }
1287
1297
1288
- let TargetGuard = "sve,bf16" in {
1298
+ let TargetGuard = "( sve,bf16)|sme " in {
1289
1299
def SVUNDEF_1_BF16 : SInst<"svundef_{d}", "dv", "b", MergeNone, "", [IsUndef, IsSVEOrStreamingSVE]>;
1290
1300
def SVUNDEF_2_BF16 : SInst<"svundef2_{d}", "2v", "b", MergeNone, "", [IsUndef, IsSVEOrStreamingSVE]>;
1291
1301
def SVUNDEF_3_BF16 : SInst<"svundef3_{d}", "3v", "b", MergeNone, "", [IsUndef, IsSVEOrStreamingSVE]>;
@@ -1303,15 +1313,17 @@ let TargetGuard = "sve2p1|sme2" in {
1303
1313
1304
1314
////////////////////////////////////////////////////////////////////////////////
1305
1315
// Vector insertion and extraction
1316
+ let TargetGuard = "sve|sme" in { // FIXME: Make this the default for most operations.
1306
1317
def SVGET_2 : SInst<"svget2[_{d}]", "d2i", "csilUcUsUiUlhfd", MergeNone, "", [IsTupleGet, IsSVEOrStreamingSVE], [ImmCheck<1, ImmCheck0_1>]>;
1307
1318
def SVGET_3 : SInst<"svget3[_{d}]", "d3i", "csilUcUsUiUlhfd", MergeNone, "", [IsTupleGet, IsSVEOrStreamingSVE], [ImmCheck<1, ImmCheck0_2>]>;
1308
1319
def SVGET_4 : SInst<"svget4[_{d}]", "d4i", "csilUcUsUiUlhfd", MergeNone, "", [IsTupleGet, IsSVEOrStreamingSVE], [ImmCheck<1, ImmCheck0_3>]>;
1309
1320
1310
1321
def SVSET_2 : SInst<"svset2[_{d}]", "22id", "csilUcUsUiUlhfd", MergeNone, "", [IsTupleSet, IsSVEOrStreamingSVE], [ImmCheck<1, ImmCheck0_1>]>;
1311
1322
def SVSET_3 : SInst<"svset3[_{d}]", "33id", "csilUcUsUiUlhfd", MergeNone, "", [IsTupleSet, IsSVEOrStreamingSVE], [ImmCheck<1, ImmCheck0_2>]>;
1312
1323
def SVSET_4 : SInst<"svset4[_{d}]", "44id", "csilUcUsUiUlhfd", MergeNone, "", [IsTupleSet, IsSVEOrStreamingSVE], [ImmCheck<1, ImmCheck0_3>]>;
1324
+ }
1313
1325
1314
- let TargetGuard = "sve,bf16" in {
1326
+ let TargetGuard = "( sve,bf16)|sme " in {
1315
1327
def SVGET_2_BF16 : SInst<"svget2[_{d}]", "d2i", "b", MergeNone, "", [IsTupleGet, IsSVEOrStreamingSVE], [ImmCheck<1, ImmCheck0_1>]>;
1316
1328
def SVGET_3_BF16 : SInst<"svget3[_{d}]", "d3i", "b", MergeNone, "", [IsTupleGet, IsSVEOrStreamingSVE], [ImmCheck<1, ImmCheck0_2>]>;
1317
1329
def SVGET_4_BF16 : SInst<"svget4[_{d}]", "d4i", "b", MergeNone, "", [IsTupleGet, IsSVEOrStreamingSVE], [ImmCheck<1, ImmCheck0_3>]>;
@@ -1515,7 +1527,7 @@ def SVSBCLT_N : SInst<"svsbclt[_n_{d}]", "ddda", "UiUl", MergeNone, "aarch64_sve
1515
1527
////////////////////////////////////////////////////////////////////////////////
1516
1528
// SVE2 - Multiplication by indexed elements
1517
1529
1518
- let TargetGuard = "sve2" in {
1530
+ let TargetGuard = "sve2|sme " in {
1519
1531
def SVMLA_LANE_2 : SInst<"svmla_lane[_{d}]", "ddddi", "silUsUiUl", MergeNone, "aarch64_sve_mla_lane", [IsSVEOrStreamingSVE], [ImmCheck<3, ImmCheckLaneIndex, 2>]>;
1520
1532
def SVMLS_LANE_2 : SInst<"svmls_lane[_{d}]", "ddddi", "silUsUiUl", MergeNone, "aarch64_sve_mls_lane", [IsSVEOrStreamingSVE], [ImmCheck<3, ImmCheckLaneIndex, 2>]>;
1521
1533
def SVMUL_LANE_2 : SInst<"svmul_lane[_{d}]", "dddi", "silUsUiUl", MergeNone, "aarch64_sve_mul_lane", [IsSVEOrStreamingSVE], [ImmCheck<2, ImmCheckLaneIndex, 1>]>;
0 commit comments