@@ -614,16 +614,30 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM_,
614614 for (auto Op : {ISD::STRICT_FADD, ISD::STRICT_FSUB, ISD::STRICT_FMUL,
615615 ISD::STRICT_FDIV, ISD::STRICT_FMA, ISD::STRICT_FSQRT})
616616 setOperationAction(Op, MVT::f64, Legal);
617+
618+ setOperationAction(ISD::STRICT_FP_ROUND, MVT::f32, Legal);
619+ setOperationAction(ISD::STRICT_FP_EXTEND, MVT::f64, Legal);
617620 }
618621 }
619622
620623 if (Subtarget->hasFullFP16()) {
624+ for (auto Op : {ISD::STRICT_FADD, ISD::STRICT_FSUB, ISD::STRICT_FMUL,
625+ ISD::STRICT_FDIV, ISD::STRICT_FMA, ISD::STRICT_FSQRT})
626+ setOperationAction(Op, MVT::f16, Legal);
627+
621628 addRegisterClass(MVT::f16, &ARM::HPRRegClass);
622629 setOperationAction(ISD::BITCAST, MVT::i16, Custom);
623630 setOperationAction(ISD::BITCAST, MVT::f16, Custom);
624631
625632 setOperationAction(ISD::FMINNUM, MVT::f16, Legal);
626633 setOperationAction(ISD::FMAXNUM, MVT::f16, Legal);
634+ setOperationAction(ISD::STRICT_FMINNUM, MVT::f16, Legal);
635+ setOperationAction(ISD::STRICT_FMAXNUM, MVT::f16, Legal);
636+
637+ if (Subtarget->hasVFPv3()) {
638+ setOperationAction(ISD::STRICT_FP_EXTEND, MVT::f32, Legal);
639+ setOperationAction(ISD::STRICT_FP_ROUND, MVT::f16, Legal);
640+ }
627641 }
628642
629643 if (Subtarget->hasBF16()) {
@@ -933,13 +947,14 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM_,
933947 setOperationAction(ISD::FP_TO_SINT, MVT::f64, Custom);
934948 setOperationAction(ISD::FP_TO_UINT, MVT::f64, Custom);
935949 setOperationAction(ISD::FP_ROUND, MVT::f32, Custom);
936- setOperationAction(ISD::STRICT_FP_TO_SINT, MVT::i32, Custom);
937- setOperationAction(ISD::STRICT_FP_TO_UINT, MVT::i32, Custom);
938950 setOperationAction(ISD::STRICT_FP_TO_SINT, MVT::f64, Custom);
939951 setOperationAction(ISD::STRICT_FP_TO_UINT, MVT::f64, Custom);
940952 setOperationAction(ISD::STRICT_FP_ROUND, MVT::f32, Custom);
941953 }
942954
955+ setOperationAction(ISD::STRICT_FP_TO_SINT, MVT::i32, Custom);
956+ setOperationAction(ISD::STRICT_FP_TO_UINT, MVT::i32, Custom);
957+
943958 if (!Subtarget->hasFP64() || !Subtarget->hasFPARMv8Base()) {
944959 setOperationAction(ISD::FP_EXTEND, MVT::f64, Custom);
945960 setOperationAction(ISD::STRICT_FP_EXTEND, MVT::f64, Custom);
@@ -1316,34 +1331,26 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM_,
13161331 setOperationAction(ISD::FSINCOS, MVT::f32, Expand);
13171332
13181333 // FP-ARMv8 implements a lot of rounding-like FP operations.
1319- if (Subtarget->hasFPARMv8Base()) {
1320- setOperationAction(ISD::FFLOOR, MVT::f32, Legal);
1321- setOperationAction(ISD::FCEIL, MVT::f32, Legal);
1322- setOperationAction(ISD::FROUND, MVT::f32, Legal);
1323- setOperationAction(ISD::FTRUNC, MVT::f32, Legal);
1324- setOperationAction(ISD::FNEARBYINT, MVT::f32, Legal);
1325- setOperationAction(ISD::FRINT, MVT::f32, Legal);
1326- setOperationAction(ISD::FROUNDEVEN, MVT::f32, Legal);
1327- setOperationAction(ISD::FMINNUM, MVT::f32, Legal);
1328- setOperationAction(ISD::FMAXNUM, MVT::f32, Legal);
1334+ if (Subtarget->hasFPARMv8Base()) {
1335+ for (auto Op :
1336+ {ISD::FFLOOR, ISD::FCEIL, ISD::FROUND,
1337+ ISD::FTRUNC, ISD::FNEARBYINT, ISD::FRINT,
1338+ ISD::FROUNDEVEN, ISD::FMINNUM, ISD::FMAXNUM,
1339+ ISD::STRICT_FFLOOR, ISD::STRICT_FCEIL, ISD::STRICT_FROUND,
1340+ ISD::STRICT_FTRUNC, ISD::STRICT_FNEARBYINT, ISD::STRICT_FRINT,
1341+ ISD::STRICT_FROUNDEVEN, ISD::STRICT_FMINNUM, ISD::STRICT_FMAXNUM}) {
1342+ setOperationAction(Op, MVT::f32, Legal);
1343+
1344+ if (Subtarget->hasFP64())
1345+ setOperationAction(Op, MVT::f64, Legal);
1346+ }
1347+
13291348 if (Subtarget->hasNEON()) {
13301349 setOperationAction(ISD::FMINNUM, MVT::v2f32, Legal);
13311350 setOperationAction(ISD::FMAXNUM, MVT::v2f32, Legal);
13321351 setOperationAction(ISD::FMINNUM, MVT::v4f32, Legal);
13331352 setOperationAction(ISD::FMAXNUM, MVT::v4f32, Legal);
13341353 }
1335-
1336- if (Subtarget->hasFP64()) {
1337- setOperationAction(ISD::FFLOOR, MVT::f64, Legal);
1338- setOperationAction(ISD::FCEIL, MVT::f64, Legal);
1339- setOperationAction(ISD::FROUND, MVT::f64, Legal);
1340- setOperationAction(ISD::FTRUNC, MVT::f64, Legal);
1341- setOperationAction(ISD::FNEARBYINT, MVT::f64, Legal);
1342- setOperationAction(ISD::FRINT, MVT::f64, Legal);
1343- setOperationAction(ISD::FROUNDEVEN, MVT::f64, Legal);
1344- setOperationAction(ISD::FMINNUM, MVT::f64, Legal);
1345- setOperationAction(ISD::FMAXNUM, MVT::f64, Legal);
1346- }
13471354 }
13481355
13491356 // FP16 often need to be promoted to call lib functions
@@ -1498,6 +1505,8 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM_,
14981505 Align(1ULL << Subtarget->getPreferBranchLogAlignment()));
14991506
15001507 setMinFunctionAlignment(Subtarget->isThumb() ? Align(2) : Align(4));
1508+
1509+ IsStrictFPEnabled = true;
15011510}
15021511
15031512bool ARMTargetLowering::useSoftFloat() const {
0 commit comments