@@ -602,10 +602,20 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM_,
602602 setOperationAction(ISD::FP_TO_SINT_SAT, MVT::i64, Custom);
603603 setOperationAction(ISD::FP_TO_UINT_SAT, MVT::i64, Custom);
604604
605- if (!Subtarget->hasVFP2Base())
605+ if (!Subtarget->hasVFP2Base()) {
606606 setAllExpand(MVT::f32);
607- if (!Subtarget->hasFP64())
607+ } else {
608+ for (auto Op : {ISD::STRICT_FADD, ISD::STRICT_FSUB, ISD::STRICT_FMUL,
609+ ISD::STRICT_FDIV, ISD::STRICT_FMA, ISD::STRICT_FSQRT})
610+ setOperationAction(Op, MVT::f32, Legal);
611+ }
612+ if (!Subtarget->hasFP64()) {
608613 setAllExpand(MVT::f64);
614+ } else {
615+ for (auto Op : {ISD::STRICT_FADD, ISD::STRICT_FSUB, ISD::STRICT_FMUL,
616+ ISD::STRICT_FDIV, ISD::STRICT_FMA, ISD::STRICT_FSQRT})
617+ setOperationAction(Op, MVT::f64, Legal);
618+ }
609619 }
610620
611621 if (Subtarget->hasFullFP16()) {
@@ -1336,28 +1346,26 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM_,
13361346
13371347 // FP16 often need to be promoted to call lib functions
13381348 if (Subtarget->hasFullFP16()) {
1339- setOperationAction(ISD::FREM, MVT::f16, Promote);
1349+ for (auto Op : {ISD::FREM, ISD::FSIN, ISD::FCOS,
1350+ ISD::FTAN, ISD::FSINCOS, ISD::FPOWI,
1351+ ISD::FPOW, ISD::FEXP, ISD::FEXP2,
1352+ ISD::FEXP10, ISD::FLOG, ISD::FLOG10,
1353+ ISD::FLOG2, ISD::STRICT_FREM, ISD::STRICT_FSIN,
1354+ ISD::STRICT_FCOS, ISD::STRICT_FTAN, ISD::STRICT_FPOWI,
1355+ ISD::STRICT_FPOW, ISD::STRICT_FEXP, ISD::STRICT_FEXP2,
1356+ ISD::STRICT_FLOG, ISD::STRICT_FLOG10, ISD::STRICT_FLOG2}) {
1357+ setOperationAction(Op, MVT::f16, Promote);
1358+ }
1359+
1360+ for (auto Op : {ISD::FROUND, ISD::FROUNDEVEN, ISD::FTRUNC,
1361+ ISD::FNEARBYINT, ISD::FRINT, ISD::FFLOOR,
1362+ ISD::FCEIL, ISD::STRICT_FROUND, ISD::STRICT_FROUNDEVEN,
1363+ ISD::STRICT_FTRUNC, ISD::STRICT_FNEARBYINT, ISD::STRICT_FRINT,
1364+ ISD::STRICT_FFLOOR, ISD::STRICT_FCEIL}) {
1365+ setOperationAction(Op, MVT::f16, Legal);
1366+ }
1367+
13401368 setOperationAction(ISD::FCOPYSIGN, MVT::f16, Expand);
1341- setOperationAction(ISD::FSIN, MVT::f16, Promote);
1342- setOperationAction(ISD::FCOS, MVT::f16, Promote);
1343- setOperationAction(ISD::FTAN, MVT::f16, Promote);
1344- setOperationAction(ISD::FSINCOS, MVT::f16, Promote);
1345- setOperationAction(ISD::FPOWI, MVT::f16, Promote);
1346- setOperationAction(ISD::FPOW, MVT::f16, Promote);
1347- setOperationAction(ISD::FEXP, MVT::f16, Promote);
1348- setOperationAction(ISD::FEXP2, MVT::f16, Promote);
1349- setOperationAction(ISD::FEXP10, MVT::f16, Promote);
1350- setOperationAction(ISD::FLOG, MVT::f16, Promote);
1351- setOperationAction(ISD::FLOG10, MVT::f16, Promote);
1352- setOperationAction(ISD::FLOG2, MVT::f16, Promote);
1353-
1354- setOperationAction(ISD::FROUND, MVT::f16, Legal);
1355- setOperationAction(ISD::FROUNDEVEN, MVT::f16, Legal);
1356- setOperationAction(ISD::FTRUNC, MVT::f16, Legal);
1357- setOperationAction(ISD::FNEARBYINT, MVT::f16, Legal);
1358- setOperationAction(ISD::FRINT, MVT::f16, Legal);
1359- setOperationAction(ISD::FFLOOR, MVT::f16, Legal);
1360- setOperationAction(ISD::FCEIL, MVT::f16, Legal);
13611369 }
13621370
13631371 if (Subtarget->hasNEON()) {
0 commit comments