@@ -5052,17 +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
-
5071
+ def : Pat<(f16 (fcanonicalize f16:$a)),
5072
+ (FMINNMHrr f16:$a, f16:$a)>;
5073
+ }
5066
5074
//===----------------------------------------------------------------------===//
5067
5075
// Floating point three operand instructions.
5068
5076
//===----------------------------------------------------------------------===//
@@ -5567,26 +5575,41 @@ defm FMINNM : SIMDThreeSameVectorFP<0,1,0b000,"fminnm", any_fminnum>;
5567
5575
defm FMINP : SIMDThreeSameVectorFP<1,1,0b110,"fminp", int_aarch64_neon_fminp>;
5568
5576
defm FMIN : SIMDThreeSameVectorFP<0,1,0b110,"fmin", any_fminimum>;
5569
5577
5578
+ let Predicates = [HasNEON] in {
5570
5579
def : Pat<(v2f64 (fminnum_ieee (v2f64 V128:$Rn), (v2f64 V128:$Rm))),
5571
5580
(v2f64 (FMINNMv2f64 (v2f64 V128:$Rn), (v2f64 V128:$Rm)))>;
5572
- def : Pat<(v4f32 (fminnum_ieee (v4f32 V128:$Rn), (v4f32 V128:$Rm))),
5573
- (v4f32 (FMINNMv4f32 (v4f32 V128:$Rn), (v4f32 V128:$Rm)))>;
5574
- def : Pat<(v8f16 (fminnum_ieee (v8f16 V128:$Rn), (v8f16 V128:$Rm))),
5575
- (v8f16 (FMINNMv8f16 (v8f16 V128:$Rn), (v8f16 V128:$Rm)))>;
5576
- def : Pat<(v2f32 (fminnum_ieee (v2f32 V64:$Rn), (v2f32 V64:$Rm))),
5577
- (v2f32 (FMINNMv2f32 (v2f32 V64:$Rn), (v2f32 V64:$Rm)))>;
5578
- def : Pat<(v4f16 (fminnum_ieee (v4f16 V64:$Rn), (v4f16 V64:$Rm))),
5579
- (v4f16 (FMINNMv4f16 (v4f16 V64:$Rn), (v4f16 V64:$Rm)))>;
5580
5581
def : Pat<(v2f64 (fmaxnum_ieee (v2f64 V128:$Rn), (v2f64 V128:$Rm))),
5581
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)))>;
5582
5587
def : Pat<(v4f32 (fmaxnum_ieee (v4f32 V128:$Rn), (v4f32 V128:$Rm))),
5583
5588
(v4f32 (FMAXNMv4f32 (v4f32 V128:$Rn), (v4f32 V128:$Rm)))>;
5584
- def : Pat<(v8f16 (fmaxnum_ieee (v8f16 V128:$Rn), (v8f16 V128:$Rm))),
5585
- (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)))>;
5586
5593
def : Pat<(v2f32 (fmaxnum_ieee (v2f32 V64:$Rn), (v2f32 V64:$Rm))),
5587
5594
(v2f32 (FMAXNMv2f32 (v2f32 V64:$Rn), (v2f32 V64:$Rm)))>;
5595
+ def : Pat<(v2f32 (fcanonicalize (v2f32 V64:$Rn))),
5596
+ (v2f32 (FMINNMv2f32 (v2f32 V64:$Rn), (v2f32 V64:$Rn)))>;
5597
+ }
5598
+
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)))>;
5604
+ def : Pat<(v8f16 (fcanonicalize (v8f16 V128:$Rn))),
5605
+ (v8f16 (FMINNMv8f16 (v8f16 V128:$Rn), (v8f16 V128:$Rn)))>;
5606
+ def : Pat<(v4f16 (fminnum_ieee (v4f16 V64:$Rn), (v4f16 V64:$Rm))),
5607
+ (v4f16 (FMINNMv4f16 (v4f16 V64:$Rn), (v4f16 V64:$Rm)))>;
5588
5608
def : Pat<(v4f16 (fmaxnum_ieee (v4f16 V64:$Rn), (v4f16 V64:$Rm))),
5589
5609
(v4f16 (FMAXNMv4f16 (v4f16 V64:$Rn), (v4f16 V64:$Rm)))>;
5610
+ def : Pat<(v4f16 (fcanonicalize (v4f16 V64:$Rn))),
5611
+ (v4f16 (FMINNMv4f16 (v4f16 V64:$Rn), (v4f16 V64:$Rn)))>;
5612
+ }
5590
5613
5591
5614
// NOTE: The operands of the PatFrag are reordered on FMLA/FMLS because the
5592
5615
// instruction expects the addend first, while the fma intrinsic puts it last.
0 commit comments