@@ -2024,13 +2024,14 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
20242024 setOperationAction(ISD::FSHL, MVT::v16i32, Custom);
20252025 setOperationAction(ISD::FSHR, MVT::v16i32, Custom);
20262026
2027- if (Subtarget.hasDQI()) {
2027+ if (Subtarget.hasDQI() || Subtarget.hasFP16())
20282028 for (auto Opc : {ISD::SINT_TO_FP, ISD::UINT_TO_FP, ISD::STRICT_SINT_TO_FP,
20292029 ISD::STRICT_UINT_TO_FP, ISD::FP_TO_SINT, ISD::FP_TO_UINT,
20302030 ISD::STRICT_FP_TO_SINT, ISD::STRICT_FP_TO_UINT})
20312031 setOperationAction(Opc, MVT::v8i64, Custom);
2032+
2033+ if (Subtarget.hasDQI())
20322034 setOperationAction(ISD::MUL, MVT::v8i64, Legal);
2033- }
20342035
20352036 if (Subtarget.hasCDI()) {
20362037 // NonVLX sub-targets extend 128/256 vectors to use the 512 version.
@@ -19850,7 +19851,7 @@ static SDValue promoteXINT_TO_FP(SDValue Op, const SDLoc &dl,
1985019851 DAG.getNode(Op.getOpcode(), dl, NVT, Src), Rnd);
1985119852}
1985219853
19853- static bool isLegalConversion(MVT VT, bool IsSigned,
19854+ static bool isLegalConversion(MVT VT, MVT FloatVT, bool IsSigned,
1985419855 const X86Subtarget &Subtarget) {
1985519856 if (VT == MVT::v4i32 && Subtarget.hasSSE2() && IsSigned)
1985619857 return true;
@@ -19861,6 +19862,8 @@ static bool isLegalConversion(MVT VT, bool IsSigned,
1986119862 if (Subtarget.useAVX512Regs()) {
1986219863 if (VT == MVT::v16i32)
1986319864 return true;
19865+ if (VT == MVT::v8i64 && FloatVT == MVT::v8f16 && Subtarget.hasFP16())
19866+ return true;
1986419867 if (VT == MVT::v8i64 && Subtarget.hasDQI())
1986519868 return true;
1986619869 }
@@ -19882,7 +19885,7 @@ SDValue X86TargetLowering::LowerSINT_TO_FP(SDValue Op,
1988219885
1988319886 if (isSoftF16(VT, Subtarget))
1988419887 return promoteXINT_TO_FP(Op, dl, DAG);
19885- else if (isLegalConversion(SrcVT, true, Subtarget))
19888+ else if (isLegalConversion(SrcVT, VT, true, Subtarget))
1988619889 return Op;
1988719890
1988819891 if (Subtarget.isTargetWin64() && SrcVT == MVT::i128)
@@ -20386,7 +20389,7 @@ SDValue X86TargetLowering::LowerUINT_TO_FP(SDValue Op,
2038620389
2038720390 if (isSoftF16(DstVT, Subtarget))
2038820391 return promoteXINT_TO_FP(Op, dl, DAG);
20389- else if (isLegalConversion(SrcVT, false, Subtarget))
20392+ else if (isLegalConversion(SrcVT, DstVT, false, Subtarget))
2039020393 return Op;
2039120394
2039220395 if (DstVT.isVector())
@@ -21409,7 +21412,8 @@ SDValue X86TargetLowering::LowerFP_TO_INT(SDValue Op, SelectionDAG &DAG) const {
2140921412 {NVT, MVT::Other}, {Chain, Src})});
2141021413 return DAG.getNode(Op.getOpcode(), dl, VT,
2141121414 DAG.getNode(ISD::FP_EXTEND, dl, NVT, Src));
21412- } else if (isTypeLegal(SrcVT) && isLegalConversion(VT, IsSigned, Subtarget)) {
21415+ } else if (isTypeLegal(SrcVT) &&
21416+ isLegalConversion(VT, SrcVT, IsSigned, Subtarget)) {
2141321417 return Op;
2141421418 }
2141521419
0 commit comments