@@ -234,9 +234,11 @@ def HasSMEF16F16orSMEF8F16
234
234
AssemblerPredicateWithAll<(any_of FeatureSMEF16F16, FeatureSMEF8F16),
235
235
"sme-f16f16 or sme-f8f16">;
236
236
237
- // A subset of NEON instructions are legal in Streaming SVE execution mode.
238
- def HasNEONorSME : Predicate<"Subtarget->hasNEON()">,
239
- AssemblerPredicateWithAll<(any_of FeatureNEON), "neon">;
237
+ // A subset of NEON instructions are legal in Streaming SVE execution mode,
238
+ // so don't need the additional check for 'isStreamingAvailable'.
239
+ def HasNEONAndIsStreamingSafe
240
+ : Predicate<"Subtarget->hasNEON()">,
241
+ AssemblerPredicateWithAll<(any_of FeatureNEON), "neon">;
240
242
def HasRCPC : Predicate<"Subtarget->hasRCPC()">,
241
243
AssemblerPredicateWithAll<(all_of FeatureRCPC), "rcpc">;
242
244
def HasAltNZCV : Predicate<"Subtarget->hasAlternativeNZCV()">,
@@ -1345,7 +1347,7 @@ def : Pat<(v2f32 (int_aarch64_neon_bfdot
1345
1347
VectorIndexS:$idx)>;
1346
1348
}
1347
1349
1348
- let Predicates = [HasNEONorSME , HasBF16] in {
1350
+ let Predicates = [HasNEONAndIsStreamingSafe , HasBF16] in {
1349
1351
def BFCVT : BF16ToSinglePrecision<"bfcvt">;
1350
1352
// Round FP32 to BF16.
1351
1353
def : Pat<(bf16 (any_fpround (f32 FPR32:$Rn))), (BFCVT $Rn)>;
@@ -5784,9 +5786,9 @@ defm FACGT : SIMDThreeScalarFPCmp<1, 1, 0b101, "facgt",
5784
5786
defm FCMEQ : SIMDThreeScalarFPCmp<0, 0, 0b100, "fcmeq", AArch64fcmeq>;
5785
5787
defm FCMGE : SIMDThreeScalarFPCmp<1, 0, 0b100, "fcmge", AArch64fcmge>;
5786
5788
defm FCMGT : SIMDThreeScalarFPCmp<1, 1, 0b100, "fcmgt", AArch64fcmgt>;
5787
- defm FMULX : SIMDFPThreeScalar<0, 0, 0b011, "fmulx", int_aarch64_neon_fmulx, HasNEONorSME >;
5788
- defm FRECPS : SIMDFPThreeScalar<0, 0, 0b111, "frecps", int_aarch64_neon_frecps, HasNEONorSME >;
5789
- defm FRSQRTS : SIMDFPThreeScalar<0, 1, 0b111, "frsqrts", int_aarch64_neon_frsqrts, HasNEONorSME >;
5789
+ defm FMULX : SIMDFPThreeScalar<0, 0, 0b011, "fmulx", int_aarch64_neon_fmulx, HasNEONAndIsStreamingSafe >;
5790
+ defm FRECPS : SIMDFPThreeScalar<0, 0, 0b111, "frecps", int_aarch64_neon_frecps, HasNEONAndIsStreamingSafe >;
5791
+ defm FRSQRTS : SIMDFPThreeScalar<0, 1, 0b111, "frsqrts", int_aarch64_neon_frsqrts, HasNEONAndIsStreamingSafe >;
5790
5792
defm SQADD : SIMDThreeScalarBHSD<0, 0b00001, "sqadd", int_aarch64_neon_sqadd>;
5791
5793
defm SQDMULH : SIMDThreeScalarHS< 0, 0b10110, "sqdmulh", int_aarch64_neon_sqdmulh>;
5792
5794
defm SQRDMULH : SIMDThreeScalarHS< 1, 0b10110, "sqrdmulh", int_aarch64_neon_sqrdmulh>;
@@ -5815,7 +5817,7 @@ let Predicates = [HasRDM] in {
5815
5817
5816
5818
defm : FMULScalarFromIndexedLane0Patterns<"FMULX", "16", "32", "64",
5817
5819
int_aarch64_neon_fmulx,
5818
- [HasNEONorSME ]>;
5820
+ [HasNEONAndIsStreamingSafe ]>;
5819
5821
5820
5822
let Predicates = [HasNEON] in {
5821
5823
def : InstAlias<"cmls $dst, $src1, $src2",
@@ -5889,9 +5891,9 @@ defm FCVTPU : SIMDFPTwoScalar< 1, 1, 0b11010, "fcvtpu">;
5889
5891
def FCVTXNv1i64 : SIMDInexactCvtTwoScalar<0b10110, "fcvtxn">;
5890
5892
defm FCVTZS : SIMDFPTwoScalar< 0, 1, 0b11011, "fcvtzs">;
5891
5893
defm FCVTZU : SIMDFPTwoScalar< 1, 1, 0b11011, "fcvtzu">;
5892
- defm FRECPE : SIMDFPTwoScalar< 0, 1, 0b11101, "frecpe", HasNEONorSME >;
5893
- defm FRECPX : SIMDFPTwoScalar< 0, 1, 0b11111, "frecpx", HasNEONorSME >;
5894
- defm FRSQRTE : SIMDFPTwoScalar< 1, 1, 0b11101, "frsqrte", HasNEONorSME >;
5894
+ defm FRECPE : SIMDFPTwoScalar< 0, 1, 0b11101, "frecpe", HasNEONAndIsStreamingSafe >;
5895
+ defm FRECPX : SIMDFPTwoScalar< 0, 1, 0b11111, "frecpx", HasNEONAndIsStreamingSafe >;
5896
+ defm FRSQRTE : SIMDFPTwoScalar< 1, 1, 0b11101, "frsqrte", HasNEONAndIsStreamingSafe >;
5895
5897
defm NEG : SIMDTwoScalarD< 1, 0b01011, "neg",
5896
5898
UnOpFrag<(sub immAllZerosV, node:$LHS)> >;
5897
5899
defm SCVTF : SIMDFPTwoScalarCVT< 0, 0, 0b11101, "scvtf", AArch64sitof>;
@@ -5910,7 +5912,7 @@ def : Pat<(v1i64 (AArch64vashr (v1i64 V64:$Rn), (i32 63))),
5910
5912
(CMLTv1i64rz V64:$Rn)>;
5911
5913
5912
5914
// Round FP64 to BF16.
5913
- let Predicates = [HasNEONorSME , HasBF16] in
5915
+ let Predicates = [HasNEONAndIsStreamingSafe , HasBF16] in
5914
5916
def : Pat<(bf16 (any_fpround (f64 FPR64:$Rn))),
5915
5917
(BFCVT (FCVTXNv1i64 $Rn))>;
5916
5918
@@ -6011,7 +6013,7 @@ def : Pat<(v2f64 (AArch64frsqrts (v2f64 FPR128:$Rn), (v2f64 FPR128:$Rm))),
6011
6013
// Some float -> int -> float conversion patterns for which we want to keep the
6012
6014
// int values in FP registers using the corresponding NEON instructions to
6013
6015
// avoid more costly int <-> fp register transfers.
6014
- let Predicates = [HasNEONorSME ] in {
6016
+ let Predicates = [HasNEONAndIsStreamingSafe ] in {
6015
6017
def : Pat<(f64 (any_sint_to_fp (i64 (any_fp_to_sint f64:$Rn)))),
6016
6018
(SCVTFv1i64 (i64 (FCVTZSv1i64 f64:$Rn)))>;
6017
6019
def : Pat<(f32 (any_sint_to_fp (i32 (any_fp_to_sint f32:$Rn)))),
0 commit comments