@@ -218,6 +218,16 @@ def AArch64fsub_p_contract : PatFrag<(ops node:$op1, node:$op2, node:$op3),
218
218
return N->getFlags().hasAllowContract();
219
219
}]>;
220
220
221
+ def AArch64fminnm_p_nnan : PatFrag<(ops node:$op1, node:$op2, node:$op3),
222
+ (AArch64fminnm_p node:$op1, node:$op2, node:$op3), [{
223
+ return N->getFlags().hasNoNaNs();
224
+ }]>;
225
+
226
+ def AArch64fmaxnm_p_nnan : PatFrag<(ops node:$op1, node:$op2, node:$op3),
227
+ (AArch64fmaxnm_p node:$op1, node:$op2, node:$op3), [{
228
+ return N->getFlags().hasNoNaNs();
229
+ }]>;
230
+
221
231
def SDT_AArch64Arith_Imm : SDTypeProfile<1, 3, [
222
232
SDTCisVec<0>, SDTCisVec<1>, SDTCisVec<2>, SDTCisVT<3,i32>,
223
233
SDTCVecEltisVT<1,i1>, SDTCisSameAs<0,2>
@@ -469,6 +479,24 @@ def AArch64fmls_m1 : PatFrags<(ops node:$pg, node:$za, node:$zn, node:$zm),
469
479
(vselect node:$pg, (AArch64fsub_p_contract (SVEAllActive), node:$za, (AArch64fmul_p_oneuse (SVEAllActive), node:$zn, node:$zm)), node:$za),
470
480
(vselect node:$pg, (AArch64fma_p (SVEAllActive), (AArch64fneg_mt (SVEAllActive), node:$zn, (undef)), node:$zm, node:$za), node:$za)]>;
471
481
482
+ def AArch64famin_p : PatFrags<(ops node:$pred, node:$op1, node:$op2),
483
+ [(int_aarch64_sve_famin_u node:$pred, node:$op1, node:$op2),
484
+ (AArch64fmin_p node:$pred,
485
+ (AArch64fabs_mt node:$pred, node:$op1, undef),
486
+ (AArch64fabs_mt node:$pred, node:$op2, undef)),
487
+ (AArch64fminnm_p_nnan node:$pred,
488
+ (AArch64fabs_mt node:$pred, node:$op1, undef),
489
+ (AArch64fabs_mt node:$pred, node:$op2, undef))]>;
490
+
491
+ def AArch64famax_p : PatFrags<(ops node:$pred, node:$op1, node:$op2),
492
+ [(int_aarch64_sve_famax_u node:$pred, node:$op1, node:$op2),
493
+ (AArch64fmax_p node:$pred,
494
+ (AArch64fabs_mt node:$pred, node:$op1, undef),
495
+ (AArch64fabs_mt node:$pred, node:$op2, undef)),
496
+ (AArch64fmaxnm_p_nnan node:$pred,
497
+ (AArch64fabs_mt node:$pred, node:$op1, undef),
498
+ (AArch64fabs_mt node:$pred, node:$op2, undef))]>;
499
+
472
500
def AArch64add_m1 : VSelectUnpredOrPassthruPatFrags<int_aarch64_sve_add, add>;
473
501
def AArch64sub_m1 : VSelectUnpredOrPassthruPatFrags<int_aarch64_sve_sub, sub>;
474
502
def AArch64mul_m1 : VSelectCommPredOrPassthruPatFrags<int_aarch64_sve_mul, AArch64mul_p>;
@@ -4184,8 +4212,8 @@ let Predicates = [HasSVE2orSME2, HasFAMINMAX] in {
4184
4212
defm FAMIN_ZPmZ : sve_fp_2op_p_zds<0b1111, "famin", "FAMIN_ZPZZ", int_aarch64_sve_famin, DestructiveBinaryComm>;
4185
4213
defm FAMAX_ZPmZ : sve_fp_2op_p_zds<0b1110, "famax", "FAMAX_ZPZZ", int_aarch64_sve_famax, DestructiveBinaryComm>;
4186
4214
4187
- defm FAMAX_ZPZZ : sve_fp_bin_pred_hfd<int_aarch64_sve_famax_u >;
4188
- defm FAMIN_ZPZZ : sve_fp_bin_pred_hfd<int_aarch64_sve_famin_u >;
4215
+ defm FAMAX_ZPZZ : sve_fp_bin_pred_hfd<AArch64famax_p >;
4216
+ defm FAMIN_ZPZZ : sve_fp_bin_pred_hfd<AArch64famin_p >;
4189
4217
} // End HasSVE2orSME2, HasFAMINMAX
4190
4218
4191
4219
let Predicates = [HasSSVE_FP8FMA] in {
0 commit comments