@@ -5052,17 +5052,25 @@ def : Pat<(v1f64 (fminnum (v1f64 FPR64:$Rn), (v1f64 FPR64:$Rm))),
50525052
50535053def : Pat<(fminnum_ieee (f64 FPR64:$a), (f64 FPR64:$b)),
50545054 (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)>;
50595055def : Pat<(fmaxnum_ieee (f64 FPR64:$a), (f64 FPR64:$b)),
50605056 (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)>;
50615061def : Pat<(fmaxnum_ieee (f32 FPR32:$a), (f32 FPR32:$b)),
50625062 (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)>;
50635069def : Pat<(fmaxnum_ieee (f16 FPR16:$a), (f16 FPR16:$b)),
50645070 (FMAXNMHrr FPR16:$a, FPR16:$b)>;
5065-
5071+ def : Pat<(f16 (fcanonicalize f16:$a)),
5072+ (FMINNMHrr f16:$a, f16:$a)>;
5073+ }
50665074//===----------------------------------------------------------------------===//
50675075// Floating point three operand instructions.
50685076//===----------------------------------------------------------------------===//
@@ -5567,26 +5575,41 @@ defm FMINNM : SIMDThreeSameVectorFP<0,1,0b000,"fminnm", any_fminnum>;
55675575defm FMINP : SIMDThreeSameVectorFP<1,1,0b110,"fminp", int_aarch64_neon_fminp>;
55685576defm FMIN : SIMDThreeSameVectorFP<0,1,0b110,"fmin", any_fminimum>;
55695577
5578+ let Predicates = [HasNEON] in {
55705579def : Pat<(v2f64 (fminnum_ieee (v2f64 V128:$Rn), (v2f64 V128:$Rm))),
55715580 (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)))>;
55805581def : Pat<(v2f64 (fmaxnum_ieee (v2f64 V128:$Rn), (v2f64 V128:$Rm))),
55815582 (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)))>;
55825587def : Pat<(v4f32 (fmaxnum_ieee (v4f32 V128:$Rn), (v4f32 V128:$Rm))),
55835588 (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)))>;
55865593def : Pat<(v2f32 (fmaxnum_ieee (v2f32 V64:$Rn), (v2f32 V64:$Rm))),
55875594 (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)))>;
55885608def : Pat<(v4f16 (fmaxnum_ieee (v4f16 V64:$Rn), (v4f16 V64:$Rm))),
55895609 (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+ }
55905613
55915614// NOTE: The operands of the PatFrag are reordered on FMLA/FMLS because the
55925615// instruction expects the addend first, while the fma intrinsic puts it last.
0 commit comments