@@ -5052,23 +5052,25 @@ def : Pat<(v1f64 (fminnum (v1f64 FPR64:$Rn), (v1f64 FPR64:$Rm))),
5052
5052
5053
5053
def : Pat<(fminnum_ieee (f64 FPR64:$a), (f64 FPR64:$b)),
5054
5054
(FMINNMDrr FPR64:$a, FPR64:$b)>;
5055
- def : Pat<(fminnum_ieee (f32 FPR32:$a), (f32 FPR32:$b)),
5056
- (FMINNMSrr FPR32:$a, FPR32:$b)>;
5057
- def : Pat<(fminnum_ieee (f16 FPR16:$a), (f16 FPR16:$b)),
5058
- (FMINNMHrr FPR16:$a, FPR16:$b)>;
5059
5055
def : Pat<(fmaxnum_ieee (f64 FPR64:$a), (f64 FPR64:$b)),
5060
5056
(FMAXNMDrr FPR64:$a, FPR64:$b)>;
5057
+ def : Pat<(f64 (fcanonicalize f64:$a)),
5058
+ (FMINNMDrr f64:$a, f64:$a)>;
5059
+ def : Pat<(fminnum_ieee (f32 FPR32:$a), (f32 FPR32:$b)),
5060
+ (FMINNMSrr FPR32:$a, FPR32:$b)>;
5061
5061
def : Pat<(fmaxnum_ieee (f32 FPR32:$a), (f32 FPR32:$b)),
5062
5062
(FMAXNMSrr FPR32:$a, FPR32:$b)>;
5063
+ def : Pat<(f32 (fcanonicalize f32:$a)),
5064
+ (FMINNMSrr f32:$a, f32:$a)>;
5065
+
5066
+ let Predicates = [HasFullFP16] in {
5067
+ def : Pat<(fminnum_ieee (f16 FPR16:$a), (f16 FPR16:$b)),
5068
+ (FMINNMHrr FPR16:$a, FPR16:$b)>;
5063
5069
def : Pat<(fmaxnum_ieee (f16 FPR16:$a), (f16 FPR16:$b)),
5064
5070
(FMAXNMHrr FPR16:$a, FPR16:$b)>;
5065
-
5066
5071
def : Pat<(f16 (fcanonicalize f16:$a)),
5067
5072
(FMINNMHrr f16:$a, f16:$a)>;
5068
- def : Pat<(f32 (fcanonicalize f32:$a)),
5069
- (FMINNMSrr f32:$a, f32:$a)>;
5070
- def : Pat<(f64 (fcanonicalize f64:$a)),
5071
- (FMINNMDrr f64:$a, f64:$a)>;
5073
+ }
5072
5074
//===----------------------------------------------------------------------===//
5073
5075
// Floating point three operand instructions.
5074
5076
//===----------------------------------------------------------------------===//
@@ -5573,37 +5575,41 @@ defm FMINNM : SIMDThreeSameVectorFP<0,1,0b000,"fminnm", any_fminnum>;
5573
5575
defm FMINP : SIMDThreeSameVectorFP<1,1,0b110,"fminp", int_aarch64_neon_fminp>;
5574
5576
defm FMIN : SIMDThreeSameVectorFP<0,1,0b110,"fmin", any_fminimum>;
5575
5577
5578
+ let Predicates = [HasNEON] in {
5576
5579
def : Pat<(v2f64 (fminnum_ieee (v2f64 V128:$Rn), (v2f64 V128:$Rm))),
5577
5580
(v2f64 (FMINNMv2f64 (v2f64 V128:$Rn), (v2f64 V128:$Rm)))>;
5578
- def : Pat<(v4f32 (fminnum_ieee (v4f32 V128:$Rn), (v4f32 V128:$Rm))),
5579
- (v4f32 (FMINNMv4f32 (v4f32 V128:$Rn), (v4f32 V128:$Rm)))>;
5580
- def : Pat<(v8f16 (fminnum_ieee (v8f16 V128:$Rn), (v8f16 V128:$Rm))),
5581
- (v8f16 (FMINNMv8f16 (v8f16 V128:$Rn), (v8f16 V128:$Rm)))>;
5582
- def : Pat<(v2f32 (fminnum_ieee (v2f32 V64:$Rn), (v2f32 V64:$Rm))),
5583
- (v2f32 (FMINNMv2f32 (v2f32 V64:$Rn), (v2f32 V64:$Rm)))>;
5584
- def : Pat<(v4f16 (fminnum_ieee (v4f16 V64:$Rn), (v4f16 V64:$Rm))),
5585
- (v4f16 (FMINNMv4f16 (v4f16 V64:$Rn), (v4f16 V64:$Rm)))>;
5586
5581
def : Pat<(v2f64 (fmaxnum_ieee (v2f64 V128:$Rn), (v2f64 V128:$Rm))),
5587
5582
(v2f64 (FMAXNMv2f64 (v2f64 V128:$Rn), (v2f64 V128:$Rm)))>;
5583
+ def : Pat<(v2f64 (fcanonicalize (v2f64 V128:$Rn))),
5584
+ (v2f64 (FMINNMv2f64 (v2f64 V128:$Rn), (v2f64 V128:$Rn)))>;
5585
+ def : Pat<(v4f32 (fminnum_ieee (v4f32 V128:$Rn), (v4f32 V128:$Rm))),
5586
+ (v4f32 (FMINNMv4f32 (v4f32 V128:$Rn), (v4f32 V128:$Rm)))>;
5588
5587
def : Pat<(v4f32 (fmaxnum_ieee (v4f32 V128:$Rn), (v4f32 V128:$Rm))),
5589
5588
(v4f32 (FMAXNMv4f32 (v4f32 V128:$Rn), (v4f32 V128:$Rm)))>;
5590
- def : Pat<(v8f16 (fmaxnum_ieee (v8f16 V128:$Rn), (v8f16 V128:$Rm))),
5591
- (v8f16 (FMAXNMv8f16 (v8f16 V128:$Rn), (v8f16 V128:$Rm)))>;
5589
+ def : Pat<(v4f32 (fcanonicalize (v4f32 V128:$Rn))),
5590
+ (v4f32 (FMINNMv4f32 (v4f32 V128:$Rn), (v4f32 V128:$Rn)))>;
5591
+ def : Pat<(v2f32 (fminnum_ieee (v2f32 V64:$Rn), (v2f32 V64:$Rm))),
5592
+ (v2f32 (FMINNMv2f32 (v2f32 V64:$Rn), (v2f32 V64:$Rm)))>;
5592
5593
def : Pat<(v2f32 (fmaxnum_ieee (v2f32 V64:$Rn), (v2f32 V64:$Rm))),
5593
5594
(v2f32 (FMAXNMv2f32 (v2f32 V64:$Rn), (v2f32 V64:$Rm)))>;
5594
- def : Pat<(v4f16 (fmaxnum_ieee (v4f16 V64:$Rn), (v4f16 V64:$Rm))),
5595
- (v4f16 (FMAXNMv4f16 (v4f16 V64:$Rn), (v4f16 V64:$Rm)))>;
5595
+ def : Pat<(v2f32 (fcanonicalize (v2f32 V64:$Rn))),
5596
+ (v2f32 (FMINNMv2f32 (v2f32 V64:$Rn), (v2f32 V64:$Rn)))>;
5597
+ }
5596
5598
5597
- def : Pat<(v2f64 (fcanonicalize (v2f64 V128:$Rn))),
5598
- (v2f64 (FMINNMv2f64 (v2f64 V128:$Rn), (v2f64 V128:$Rn)))>;
5599
- def : Pat<(v4f32 (fcanonicalize (v4f32 V128:$Rn))),
5600
- (v4f32 (FMINNMv4f32 (v4f32 V128:$Rn), (v4f32 V128:$Rn)))>;
5599
+ let Predicates = [HasNEON, HasFullFP16] in {
5600
+ def : Pat<(v8f16 (fminnum_ieee (v8f16 V128:$Rn), (v8f16 V128:$Rm))),
5601
+ (v8f16 (FMINNMv8f16 (v8f16 V128:$Rn), (v8f16 V128:$Rm)))>;
5602
+ def : Pat<(v8f16 (fmaxnum_ieee (v8f16 V128:$Rn), (v8f16 V128:$Rm))),
5603
+ (v8f16 (FMAXNMv8f16 (v8f16 V128:$Rn), (v8f16 V128:$Rm)))>;
5601
5604
def : Pat<(v8f16 (fcanonicalize (v8f16 V128:$Rn))),
5602
5605
(v8f16 (FMINNMv8f16 (v8f16 V128:$Rn), (v8f16 V128:$Rn)))>;
5603
- def : Pat<(v2f32 (fcanonicalize (v2f32 V64:$Rn))),
5604
- (v2f32 (FMINNMv2f32 (v2f32 V64:$Rn), (v2f32 V64:$Rn)))>;
5606
+ def : Pat<(v4f16 (fminnum_ieee (v4f16 V64:$Rn), (v4f16 V64:$Rm))),
5607
+ (v4f16 (FMINNMv4f16 (v4f16 V64:$Rn), (v4f16 V64:$Rm)))>;
5608
+ def : Pat<(v4f16 (fmaxnum_ieee (v4f16 V64:$Rn), (v4f16 V64:$Rm))),
5609
+ (v4f16 (FMAXNMv4f16 (v4f16 V64:$Rn), (v4f16 V64:$Rm)))>;
5605
5610
def : Pat<(v4f16 (fcanonicalize (v4f16 V64:$Rn))),
5606
5611
(v4f16 (FMINNMv4f16 (v4f16 V64:$Rn), (v4f16 V64:$Rn)))>;
5612
+ }
5607
5613
5608
5614
// NOTE: The operands of the PatFrag are reordered on FMLA/FMLS because the
5609
5615
// instruction expects the addend first, while the fma intrinsic puts it last.
0 commit comments